欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 一個mysql死鎖場景實例分析

一個mysql死鎖場景實例分析

熱門標簽:自己做地圖標注需要些什么 天津公司外呼系統軟件 百度地圖標注要什么軟件 中國地圖標注公司 電話機器人的價格多少錢一個月 徐涇鎮騰訊地圖標注 福建外呼電銷機器人加盟 昌德訊外呼系統 400電話申請廠家現貨

前言

最近遇到一個mysql在RR級別下的死鎖問題,感覺有點意思,研究了一下,做個記錄。

涉及知識點:共享鎖、排他鎖、意向鎖、間隙鎖、插入意向鎖、鎖等待隊列

場景

隔離級別:Repeatable-Read

表結構如下

create table t (
 id int not null primary key AUTO_INCREMENT,
 a int not null default 0,
 b varchar(10) not null default '',
 c varchar(10) not null default '',
 unique key uniq_a_b(a,b),
 unique key uniq_c(c)
);

初始化數據

insert into t(a,b,c) values(1,'1','1');

有A/B兩個session,按如下順序執行兩個事務

結果是

  • B執行完4之后還是一切正常
  • A執行5的時候,被block
  • B接著執行6,B報死鎖,B回滾,A插入數據

show engine innodb status中可以看到死鎖信息,這里先不貼,先解釋幾種鎖的概念,再來理解死鎖過程

共享(S)鎖/互斥(X)鎖

  • 共享鎖允許事務讀取記錄
  • 互斥鎖允許事務讀寫記錄

這兩種其實是鎖的模式可以和行鎖、間隙鎖混搭,多個事務可以同時持有S鎖,但是只有一個事務能持有X鎖

意向鎖

一種表鎖(也是一種鎖模式),表明有事務即將給對應表的記錄加S或者X鎖。SELECT ... LOCK IN SHARE MODE會在給記錄加S鎖之前先給表加IS鎖,SELECT ... FOR UPDATE會在給記錄加X鎖之前給表加IX鎖。

這是一種mysql的鎖優化策略,并不是很清楚意向鎖的優化點在哪里,求大佬指教

兩種鎖的兼容情況如下

行鎖

很簡單,給對應行加鎖。比如update、select for update、delete等都會給涉及到的行加上行鎖,防止其他事務的操作

間隙鎖

在RR隔離級別下,為了防止幻讀現象,除了給記錄本身,還需要為記錄兩邊的間隙加上間隙鎖。
比如列a上有一個普通索引,已經有了1、5、10三條記錄,select * from t where a=5 for update除了會給5這條記錄加行鎖,還會給間隙(1,5)和(5,10)加上間隙鎖,防止其他事務插入值為5的數據造成幻讀。
當a上的普通索引變成唯一索引時,不需要間隙鎖,因為值唯一,select * from t where a=5 for update不可能讀出兩條記錄來。

間隙鎖相互兼容,因為如果互斥,事務A持有左半段(1,5),事務B持有右半段(1,10),那么當前面那個例子中a=5的記錄被刪除時,理論上左右兩個間隙鎖得合并成一個新鎖(1,10),那么這個新的大范圍鎖屬于誰呢?所以間隙鎖相互兼容,不管是S間隙鎖還是X間隙鎖

插入意向鎖

插入意向鎖其實是一種特殊的間隙鎖,從前面對間隙鎖的描述中可以得知,兩個事務在真正insert之前可以同時持有一段間隙的間隙鎖,鎖不住真正insert的這個動作。真正insert之前,mysql還會嘗試獲取對應記錄的插入意向鎖,表明有在間隙中插入一個值的意向。

插入意向鎖和間隙鎖互斥,比如事務1鎖了(1,5)這個間隙,事務2就不能獲取到a=3的插入意向鎖,所以需要鎖等待。

死鎖過程分析

接下來就可以來分析前面那個例子中的死鎖過程了,先看show engine innodb status

 *** (1) TRANSACTION:
TRANSACTION 5967, ACTIVE 8 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 9, OS thread handle 140528848688896, query id 537 192.168.128.1 root update
insert into t(a,b) values(0,'0')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 64 page no 4 n bits 72 index uniq_a_b of table `t2`.`t` trx id 5967 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

*** (2) TRANSACTION:
TRANSACTION 5968, ACTIVE 7 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 8, OS thread handle 140528848484096, query id 538 192.168.128.1 root update
insert into t(a,b) values(0,'0')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 64 page no 4 n bits 72 index uniq_a_b of table `t2`.`t` trx id 5968 lock_mode X locks gap before rec
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 64 page no 4 n bits 72 index uniq_a_b of table `t2`.`t` trx id 5968 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

*** WE ROLL BACK TRANSACTION (2)

session A(即TRANSACTION 5967)正在等待記錄(a=1,b='1')之前的插入意向鎖,session B(即TRANSACTION 5968)持有記錄(a=1,b='1')之前的間隙鎖,卻也在等待那個插入意向鎖。這說的什么玩意兒,是不是很詭異?

從頭開始分析過程

  1. A、B分別begin,開始事務
  2. A先執行select * from t where a=0 and b='0' for update; ,先加了IX鎖,然后原本意圖為給(0, '0')這條記錄加排他行鎖,但是記錄不存在,所以變成了排他間隙鎖(-∞,1)
  3. B再執行select * from t where a=0 and b='0' for update; ,也是先加了IX鎖,因為記錄不存在,所以加上了排他間隙鎖(-∞,1),但是由于間隙鎖相互兼容,所以沒有block
  4. A執行insert into t(a,b) values(0,'0'); ,這時候,要開始真正insert了,A需要獲得(0,'0')上的插入意向鎖,由于和B持有的(-∞,1)排他間隙鎖沖突,所以鎖等待,進入記錄(0,'0')的鎖等待隊列(雖然記錄并不存在)
  5. B執行insert into t(a,b) values(0,'0'); ,要獲取插入意向鎖,發現雖然B自己是持有(-∞,1)的排他間隙鎖,但是A也有,所以進入等待隊列,等待A釋放
  6. 叮,死鎖發生

死鎖信息解讀

事務1(TRANSACTION 5967),等待獲得鎖index uniq_a_b of table t2.t trx id 5967 lock_mode X locks gap before rec insert intention waiting,即在唯一索引uniq_a_b上的插入意向鎖(lock_mode X locks gap before rec insert intention)
鎖的邊界為

 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

表明兩行記錄

  • 0和1表示uniq_a_b上的值,a=1,b=0x31(即'1'的ascii碼)
  • a=1,b='1'對應的主鍵id=1,因為innodb的索引結構決定的,二級索引(非主鍵索引)指向主鍵索引,主鍵索引再指向數據,所以需要給主鍵加索引

至于int值按位或上的0x80000000就不是很清楚為什么了,需要大佬解讀

事務2(TRANSACTION 5968),持有間隙鎖index uniq_a_b of table t2.t trx id 5968 lock_mode X locks gap before rec,等待插入意向鎖index uniq_a_b of table t2.t trx id 5968 lock_mode X locks gap before rec insert intention,所以死鎖發生。

原則上是innodb引擎判斷哪個事務回滾代價小就回滾哪個事務,但是具體評判標準不是很清楚(再一次需要大佬),這里innodb選擇了回滾事務2。至此,死鎖過程分析完畢

One More Thing

還沒完。。。有個神奇的現象是,如果表結構變成

create table t (
 id int not null primary key AUTO_INCREMENT,
 a int not null default 0,
 b varchar(10) not null default '',
 c varchar(10) not null default '',
 unique key uniq_c(c),
 unique key uniq_a_b(a,b)
);
insert into t(a,b,c) values(1,1,1);

只是把c上的唯一索引uniq_c放到了uniq_a_b前面,那么最后的死鎖信息就變了!

 *** (1) TRANSACTION:
TRANSACTION 5801, ACTIVE 5 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 1
MySQL thread id 5, OS thread handle 140528848688896, query id 380 192.168.128.1 root update
insert into t2(a,b) values(0,'0')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 56 page no 5 n bits 72 index uniq_a_b of table `t2`.`t2` trx id 5801 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

*** (2) TRANSACTION:
TRANSACTION 5802, ACTIVE 4 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 6, OS thread handle 140528848484096, query id 381 192.168.128.1 root update
insert into t2(a,b) values(0,'0')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 56 page no 5 n bits 72 index uniq_a_b of table `t2`.`t2` trx id 5802 lock_mode X locks gap before rec
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 1; hex 31; asc 1;;
 2: len 4; hex 80000001; asc  ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 56 page no 4 n bits 72 index uniq_c of table `t2`.`t2` trx id 5802 lock mode S waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 0; hex ; asc ;;
 1: len 4; hex 80000002; asc  ;;

*** WE ROLL BACK TRANSACTION (2)

事務2等待的鎖由前面的插入意向鎖變成了共享鎖。什么鬼?

由于沒看過源碼,只能根據現象倒推:因為表結構上c的唯一索引在(a,b)前面,而插入的時候沒指定c的值,用的默認值0,innodb需要先去查一下有沒有0這條記錄,有的話就要報唯一鍵沖突了,所以先要加S鎖,但是在(0,'0')這條記錄上已經有了IX鎖,看一下前面的兼容性矩陣,S鎖和IX鎖互斥,所以也只能鎖等待

總結

看似一句簡單的select和insert,底下設計非常復雜的鎖機制,理解這些鎖機制有利于寫出高效的SQL(至少是正確的😂)

遺留問題:

  1. 意向鎖的優化點是哪
  2. 鎖信息里,行記錄按位或上的0x80000000是啥
  3. 鎖互斥的判定順序,場景1中,(0,'0')上有兼容的間隙鎖,也有等待隊列中的鎖,先判定哪個?
  4. innodb計算事務回滾代價的算法

參考資料

  • http://hedengcheng.com/?p=771
  • https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-insert-intention-locks
  • https://dev.mysql.com/doc/refman/5.7/en/innodb-next-key-locking.html
  • https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-understanding-innodb-locking.html

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 由不同的索引更新解決MySQL死鎖套路
  • 通過唯一索引S鎖與X鎖來了解MySQL死鎖套路
  • 詳解MySQL(InnoDB)是如何處理死鎖的
  • 實例講解MySQL中樂觀鎖和悲觀鎖
  • Mysql查詢正在執行的事務以及等待鎖的操作方式
  • 簡單了解 MySQL 中相關的鎖

標簽:鄂爾多斯 梅河口 駐馬店 陜西 北京 荊門 昌都 黔西

巨人網絡通訊聲明:本文標題《一個mysql死鎖場景實例分析》,本文關鍵詞  一個,mysql,死鎖,場景,實例分析,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一個mysql死鎖場景實例分析》相關的同類信息!
  • 本頁收集關于一個mysql死鎖場景實例分析的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    99国产精品久久久久久久久久久| 日韩福利小视频| 欧美视频在线一区| 国产精品黄色在线观看| 国产一区二区三区四区五区美女| 自拍偷拍中文字幕| 欧美一级国产精品| 日日噜噜夜夜狠狠视频欧美人| 69xxx免费视频| 欧美日韩美女一区二区| 一个色综合网站| 91视频免费入口| 欧美午夜精品电影| 亚洲综合一区二区三区| 97成人超碰视| 欧美探花视频资源| 亚洲成人在线观看视频| 中文字幕免费高清视频| 日韩欧美资源站| 免费观看成人鲁鲁鲁鲁鲁视频| 99久久久久久久久久| 精品国产91久久久久久久妲己| 久草中文综合在线| 东京热无码av男人的天堂| 欧美激情一区二区三区不卡| 国产成a人亚洲精| 久久久久亚洲av无码专区体验| 亚洲丝袜精品丝袜在线| 欧美性猛交乱大交| 制服丝袜中文字幕亚洲| 人人超碰91尤物精品国产| 欧美大波大乳巨大乳| 国产农村妇女精品| 99精品欧美一区二区三区综合在线| 色国产精品一区在线观看| 亚洲综合一区二区| 亚洲精品一区二区三区蜜桃下载 | 蜜桃av.com| 国产精品白丝在线| 97se狠狠狠综合亚洲狠狠| 欧美性高清videossexo| 亚洲成人手机在线| 播金莲一级淫片aaaaaaa| 久久久久久久久久电影| 成人永久aaa| 欧美色手机在线观看| 日产欧产美韩系列久久99| 亚洲国产日韩一区无码精品久久久| 国产欧美视频一区二区| 91视频在线看| 日韩无一区二区| 国产成人综合在线| 欧美视频一区二区三区四区 | 国产在线观看免费一区| 五月天丁香激情| 日韩一区精品字幕| 日本不卡一区视频| 亚洲一区二区成人在线观看| 9.1成人看片免费版| 国产精品美女www爽爽爽| 一级全黄裸体片| 久久久综合视频| 91亚洲永久精品| 欧美岛国在线观看| 成人一区在线看| 日韩网站在线看片你懂的| 国产成人精品一区二| 欧美日韩国产一级片| 韩国v欧美v亚洲v日本v| 在线精品国精品国产尤物884a| 免费三级欧美电影| 一区二区视频免费看| 日本中文一区二区三区| 日本高清不卡免费| 日韩福利视频导航| 色成人在线视频| 激情图区综合网| 欧美日韩精品是欧美日韩精品| 国模套图日韩精品一区二区 | 樱桃国产成人精品视频| 日本少妇高潮喷水xxxxxxx| 亚洲免费av网站| 美女100%露胸无遮挡| 亚洲风情在线资源站| 日本 欧美 国产| 日韩黄色片在线观看| 色老汉av一区二区三区| 狠狠色丁香久久婷婷综合_中| 欧美色图片你懂的| 国产suv精品一区二区6| 欧美大胆人体bbbb| 日韩女优在线视频| 一区视频在线播放| 欧美成人另类视频| 日产国产高清一区二区三区| 在线一区二区观看| 国产成人综合网| 精品国产1区二区| www.88av| 亚洲综合激情网| 国产精品九九九九九九| 国产精品一区二区男女羞羞无遮挡| 欧美精品一卡二卡| 熟妇无码乱子成人精品| 国产精品免费视频网站| 国产又粗又猛又爽又黄av| 日日噜噜夜夜狠狠视频欧美人| 欧美伊人精品成人久久综合97| 国产精品一区二区久激情瑜伽| 日韩美女在线视频| 这里只有精品在线观看视频| 国产欧美日韩三级| 欧美丰满老妇熟乱xxxxyyy| 亚洲成人tv网| 欧美日韩国产综合视频在线观看| 不卡av在线网| 国产精品久久久久久久久搜平片 | 在线免费观看污视频| 亚洲最大成人综合| 在线观看国产精品网站| 成人av在线播放网址| 国产精品天干天干在观线| 懂色av粉嫩av浪潮av| 国内久久婷婷综合| 精品毛片乱码1区2区3区| 中文字幕丰满乱子伦无码专区| 日韩av电影天堂| 欧美一激情一区二区三区| 中文字幕乱码一区| 免费三级欧美电影| 精品国产凹凸成av人导航| 在线观看日本中文字幕| 久久国产夜色精品鲁鲁99| 精品国产电影一区二区| 国产精品一二三区在线观看| 另类调教123区 | 大乳护士喂奶hd| 丝袜国产日韩另类美女| 欧美一级黄色片| 美女久久久久久久久久| 激情欧美一区二区三区在线观看| www成人在线观看| 天堂网av2018| 成人综合在线视频| 亚洲另类在线一区| 欧美日韩国产一级| 中文字幕一区二区三区人妻不卡| 蜜臀久久99精品久久久久宅男 | 国产精品国模大尺度视频| 色屁屁一区二区| 能看毛片的网站| 日韩精品色哟哟| 亚洲精品在线网站| 黑人操日本美女| 中文字幕一二三| 天天影视涩香欲综合网| 精品欧美黑人一区二区三区| 99热6这里只有精品| 成人国产精品免费观看动漫| 亚洲激情图片一区| 538在线一区二区精品国产| 人妻体内射精一区二区| 成人中文字幕合集| 一区二区欧美国产| 日韩三级伦理片妻子的秘密按摩| 婷婷色一区二区三区| 国产成人精品三级麻豆| 亚洲黄色片在线观看| 日韩一区二区三区av| 国产小视频你懂的| 午夜诱惑痒痒网| 美腿丝袜一区二区三区| 中文字幕+乱码+中文字幕一区| 欧美性感一区二区三区| 人人妻人人澡人人爽人人精品| 国产一区二区三区久久悠悠色av| 中文字幕一区二区三| 欧美欧美午夜aⅴ在线观看| 丁香激情五月少妇| 中文字幕av一区二区三区人妻少妇| 免费在线看成人av| 中文字幕中文字幕在线一区 | 国产一级伦理片| 国产老肥熟一区二区三区| 亚洲精品网站在线观看| 欧美不卡在线视频| 色欧美日韩亚洲| 国产人妻一区二区| 97久久精品人人做人人爽 | 丝袜亚洲精品中文字幕一区| 久久免费电影网| 欧美日韩在线观看一区二区| a级片在线观看| 91捆绑美女网站| 黑人精品欧美一区二区蜜桃| 亚洲黄色免费电影| 亚洲国产精品传媒在线观看| 欧美精品亚洲二区| 亚洲最大的黄色网址| 中文字幕免费高清|