華為云高斯db線上死鎖問題

華為云高斯db線上死鎖問題

前言

線上高斯db在業(yè)務(wù)高峰期出現(xiàn)上萬條死鎖苇经,華為云給出了死鎖日志(ps 阿里云是直接可以在控制臺(tái)看到的)

死鎖日志

RECORD LOCKS space id 6534 page no 112806 n bits 568 index idx_a of table `XXX`.`XXXX` trx id 756319989 lock_mode X locks gap before rec
Record lock, heap no 474 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 8; hex 80000000000010ba; asc         ;;
 1: len 8; hex 8000000000006b31; asc       k1;;
 2: len 8; hex 80000000002ec2be; asc      .  ;;

日志已經(jīng)影去公司相關(guān)信息彰导,看到明顯的gap lock導(dǎo)致的死鎖饲梭。數(shù)據(jù)庫設(shè)置的默認(rèn)隔離級別是read committed煌张。依稀記得rc級別不會(huì)有g(shù)ap lock的。查詢mysql官網(wǎng)
gap lock

Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED. In this case, gap locking is disabled for searches and index scans and is used only for foreign-key constraint checking and duplicate-key checking.

與記憶中的基本一致娃豹。我們沒有使用外鍵也沒有使用唯一鍵檢查焚虱,是不會(huì)存在gap lock的。

再次跟華為云確認(rèn)他們與mysql 8.0行為是一致的懂版。

華為云排查

華為云排查后告知我們數(shù)據(jù)庫默認(rèn)隔離級別是對的鹃栽,原因是我們的session 每次都設(shè)置了會(huì)話的隔離級別為rr。代碼中我們都是使用spring 申明式事務(wù)做事務(wù)躯畴,排查后并沒有發(fā)現(xiàn)使用rr級別民鼓。我們跟華為云溝通后,華為云的意思是讓我排查下spring的源碼蓬抄,查看下是不是哪里設(shè)置了事務(wù)的隔離級別丰嘉。

排查源碼

  1. org.springframework.transaction.support.AbstractPlatformTransactionManager[getTransaction(TransactionDefinition definition)]

  2. org.springframework.jdbc.datasource.DataSourceTransactionManager[doBegin(Object transaction, TransactionDefinition definition)]

  3. org.springframework.jdbc.datasource.DataSourceUtils[prepareConnectionForTransaction(Connection con, TransactionDefinition definition)]

  4. com.mysql.cj.jdbc.ConnectionImpl[setTransactionIsolation(int level)]

包和類名中跨號內(nèi)是方法
這邊只貼spring和jdbc中設(shè)置隔離級別部分源碼

 // 非默認(rèn)級別的情況下去設(shè)置隔離級別
 if (definition != null && definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
            if (logger.isDebugEnabled()) {
                logger.debug("Changing isolation level of JDBC Connection [" + con + "] to " +
                        definition.getIsolationLevel());
            }
            int currentIsolation = con.getTransactionIsolation();
            if (currentIsolation != definition.getIsolationLevel()) {
                previousIsolationLevel = currentIsolation;
                con.setTransactionIsolation(definition.getIsolationLevel());
            }
        }

jdbc

 switch (level) {
                    case java.sql.Connection.TRANSACTION_NONE:
                        throw SQLError.createSQLException(Messages.getString("Connection.24"), getExceptionInterceptor());

                    case java.sql.Connection.TRANSACTION_READ_COMMITTED:
                        sql = "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED";

                        break;

                    case java.sql.Connection.TRANSACTION_READ_UNCOMMITTED:
                        sql = "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";

                        break;

                    case java.sql.Connection.TRANSACTION_REPEATABLE_READ:
                        sql = "SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ";

                        break;

                    case java.sql.Connection.TRANSACTION_SERIALIZABLE:
                        sql = "SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE";

                        break;

                    default:
                        throw SQLError.createSQLException(Messages.getString("Connection.25", new Object[] { level }),
                                MysqlErrorNumbers.SQL_STATE_DRIVER_NOT_CAPABLE, getExceptionInterceptor());
                }

spring默認(rèn)是不會(huì)去設(shè)置事務(wù)的隔離級別,設(shè)置隔離級別是jdbc實(shí)現(xiàn)的。所以spring也是沒問題的嚷缭。

最終結(jié)論

業(yè)務(wù)側(cè)并沒有問題饮亏,只能只華為云的問題了耍贾。

最后運(yùn)維排查發(fā)現(xiàn)華為云的數(shù)據(jù)庫代理默認(rèn)的隔離級別居然是repeatable-read,設(shè)備是read-committed路幸,也就是代理層每次會(huì)設(shè)置事務(wù)的隔離級別荐开。坑爹華為云简肴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晃听,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砰识,更是在濱河造成了極大的恐慌能扒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仍翰,死亡現(xiàn)場離奇詭異赫粥,居然都是意外死亡观话,警方通過查閱死者的電腦和手機(jī)予借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來频蛔,“玉大人灵迫,你說我怎么就攤上這事』尴” “怎么了瀑粥?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長三圆。 經(jīng)常有香客問我狞换,道長,這世上最難降的妖魔是什么舟肉? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任修噪,我火速辦了婚禮,結(jié)果婚禮上路媚,老公的妹妹穿的比我還像新娘黄琼。我一直安慰自己,他們只是感情好整慎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布脏款。 她就那樣靜靜地躺著,像睡著了一般裤园。 火紅的嫁衣襯著肌膚如雪撤师。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天拧揽,我揣著相機(jī)與錄音剃盾,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛万俗,可吹牛的內(nèi)容都是我干的湾笛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼闰歪,長吁一口氣:“原來是場噩夢啊……” “哼嚎研!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起库倘,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤临扮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后教翩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杆勇,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年饱亿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚜退。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彪笼,死狀恐怖钻注,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配猫,我是刑警寧澤幅恋,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泵肄,受9級特大地震影響捆交,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腐巢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一品追、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧系忙,春花似錦诵盼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛹疯,卻和暖如春戒财,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捺弦。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工饮寞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孝扛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓幽崩,卻偏偏與公主長得像苦始,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子慌申,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353