mysql鎖之行級鎖

概念


行級鎖就是鎖住表中指定行的記錄卿叽。

行鎖原理


InnoDB行鎖是通過給索引項加鎖來實現(xiàn)的肝集,如果沒有建立索引恰聘,那么采用表默認的隱式主鍵來鎖定魂挂。

innodb引擎提供行鎖種類


  1. Record Lock:單個行記錄上加鎖。鎖定的是索引項慧邮,如果沒有設置索引调限,將使用隱式的主鍵鎖定寞宫。
  2. Gap Lock:間隙鎖篮愉,不包含本身記錄的鎖定范圍。
  3. Next-Key Lock:Record Lock+Gap Lock炎码。鎖定范圍且包含自身記錄忆谓。
    InnoDB默認存儲引擎是REPEATABLE READ模式裆装,Next-Key Lock算法是默認的行記錄算法。
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

行鎖的實現(xiàn)方式


共享鎖陪毡、排他鎖

Record Lock(單條記錄鎖)

  • 鎖定范圍:當前單條記錄米母。

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_user where id = "5045dfba5f5b4cb5b805c379fc538bcb" for update;
成功:select * from edu_user;
成功:select * from edu_user where id = "1234df4446cb4cb6bc2f639830b12345" for update;
阻塞:select * from edu_user where id = "5045dfba5f5b4cb5b805c379fc538bcb" for update;
commit;
執(zhí)行阻塞內(nèi)容
commit;

說明:鎖住了id為5045dfba5f5b4cb5b805c379fc538bcb的記錄,其他行記錄可以查詢毡琉,也可以鎖操作、讀寫妙色。

Next-Key Lock(范圍鎖)


  • 設計范圍鎖的目的:解決幻讀問題(Phantom Problem)桅滋。
  • 什么是幻讀:就是在同一事務中,連續(xù)執(zhí)行兩次同樣的sql語句出現(xiàn)不同結(jié)果,第二次sql語句可能會返回之前不存在的行丐谋。
  • 正常鎖定范圍:[prev_val芍碧,where_val)、[where_val号俐,post_val)泌豆。
  • 范圍鎖防止幻讀:當前會話A會鎖定值的前面區(qū)域和后面區(qū)域,防止在操作過程中吏饿,會話B插入了值踪危,造成會話C讀取兩次結(jié)果不同。

操作:

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_test where a_val = '11' for update;
成功:insert into edu_test select 6, '9', '9';
成功:insert into edu_test select 7, '14', '14';
成功:insert into edu_test select 9, '13', '13';
阻塞:insert into edu_test select 10, '12', '12';
阻塞:insert into edu_test select 11, '11', '11';
阻塞:insert into edu_test select 12, '10', '10';
commit
commit;
執(zhí)行阻塞內(nèi)容

說明:a_val非主鍵值設置了索引猪落,a_val值為11上排他鎖贞远,那么鎖定的范圍應該為[10,11)笨忌、[11,13)蓝仲。

Next-Key Lock 退化為 Record Lock


  • 結(jié)論:當查詢的索引含有唯一屬性時,innodb會對Next-Key Lock優(yōu)化官疲,將其降級為Record Lock袱结,即鎖住索引本身,而不是范圍途凫。
  • 鎖定范圍:當前單條唯一記錄垢夹。

操作:

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_test where a_val = '11' for update;
成功:insert into edu_test select 6, '12', '12';
commit;
commit

說明:a_val非主鍵值設置為唯一索引,a_val值為11上了排他鎖颖榜,那么鎖定只為a_val=11的記錄棚饵,其他記錄不鎖定,當前鎖已經(jīng)退化為了單條記錄鎖掩完,如果硬插入a_val=11的記錄噪漾,那么只會報值重復錯誤,鎖粒度減小且蓬,提高了并發(fā)性欣硼。

Next-Key Lock 退化為 Gap Lock


  • 結(jié)論:當查詢的索引的值不存在時,那么innodb會對Next-Key Lock優(yōu)化恶阴,將其退化為Gap Lock诈胜。
  • 鎖定范圍:[prev_val,post_val)冯事。

操作:

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_test where a_val = '12' for update;
成功:insert into edu_test select 6, 9, '9';
成功:insert into edu_test select 7, 10, '10';
成功:insert into edu_test select 8, 14, '14';
成功:insert into edu_test select 9, 13, '13';
阻塞:insert into edu_test select 10, 11, '11';
阻塞:insert into edu_test select 11, 12, '12';
commit
commit;
執(zhí)行阻塞內(nèi)容

說明:a_val非主鍵值設置了索引焦匈,a_val設置了不存在的排他鎖,這樣innodb會對Next-Key Lock優(yōu)化昵仅,將其退化為Gap Lock缓熟。鎖定范圍是[11, 13)累魔。

order by 排序情況


order by排序會先將當前需要查詢的結(jié)果排序,然后根據(jù)查詢索引值前后加鎖够滑。

  • 鎖定范圍:(prev_val垦写,post_val]。

操作:

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_test where a_val = 20 order by a_val desc for update;
成功:insert into edu_test select 6, 12, '12';
成功:insert into edu_test select 7, 32, '32';
成功:insert into edu_test select 8, 31, '31';
阻塞:insert into edu_test select 9, 13, '13';
阻塞:insert into edu_test select 10, 25, '25';
commit
commit;
執(zhí)行阻塞內(nèi)容

分析:先倒序排序

31彰触, 20梯投, 13, 11况毅, 10

說明:當前索引值a_val為20分蓖,那么鎖定范圍為(31,13]俭茧。

范圍查詢情況


  • 鎖定范圍:(prev_val咆疗,val1]、(val1母债,val2]午磁、(val2,post_val]毡们。

操作:

session1 session2
set autocommit = 0; set autocommit = 0;
select * from edu_test where a_val < 20 and a_val > 11 order by a_val desc for update;
成功:insert into edu_test select 6, 31, '31';
阻塞:insert into edu_test select 7, 10, '10';
commit
commit;
執(zhí)行阻塞內(nèi)容

分析:先倒序排序

31迅皇, 20, 13衙熔, 11登颓, 10

說明:當前索引值a_val為小于20、大于11红氯,那么鎖定范圍為(31框咙,10]。

參考


《MySQL技術(shù)內(nèi)幕》InnoDB存儲引擎

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痢甘,一起剝皮案震驚了整個濱河市喇嘱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塞栅,老刑警劉巖者铜,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放椰,居然都是意外死亡作烟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門砾医,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拿撩,“玉大人,你說我怎么就攤上這事绷雏⊥诽希” “怎么了怖亭?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵涎显,是天一觀的道長。 經(jīng)常有香客問我兴猩,道長期吓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任倾芝,我火速辦了婚禮讨勤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晨另。我一直安慰自己潭千,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布借尿。 她就那樣靜靜地躺著刨晴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪路翻。 梳的紋絲不亂的頭發(fā)上狈癞,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音茂契,去河邊找鬼蝶桶。 笑死,一個胖子當著我的面吹牛掉冶,可吹牛的內(nèi)容都是我干的真竖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厌小,長吁一口氣:“原來是場噩夢啊……” “哼恢共!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起召锈,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旁振,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涨岁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拐袜,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年梢薪,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹬铺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秉撇,死狀恐怖甜攀,靈堂內(nèi)的尸體忽然破棺而出秋泄,到底是詐尸還是另有隱情,我是刑警寧澤规阀,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布恒序,位于F島的核電站,受9級特大地震影響谁撼,放射性物質(zhì)發(fā)生泄漏歧胁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一厉碟、第九天 我趴在偏房一處隱蔽的房頂上張望喊巍。 院中可真熱鬧,春花似錦箍鼓、人聲如沸崭参。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何暮。三九已至,卻和暖如春之剧,著一層夾襖步出監(jiān)牢的瞬間郭卫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工背稼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贰军,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓蟹肘,卻偏偏與公主長得像词疼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帘腹,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 鎖,在計算機中球化,是協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的一種機制秽晚。在數(shù)據(jù)庫當中,當數(shù)據(jù)庫有并發(fā)事務的時候筒愚,可能會產(chǎn)生...
    北九部閱讀 2,165評論 0 1
  • 鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制赴蝇。在數(shù)據(jù)庫中,除傳統(tǒng)的計算資源(如CPU巢掺、RAM句伶、I/O等)的爭...
    薛延祥閱讀 206評論 0 0
  • 1. MySQL鎖 1.1 鎖概述 鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制(避免爭搶)劲蜻。 在數(shù)據(jù)庫中,...
    itlu閱讀 578評論 0 7
  • 一考余、事務特性 ACID屬性含義原子性(Atomicity)比如下訂單先嬉,減庫存,扣積分是一個完整的業(yè)務邏輯操作秃殉,是不...
    今年五年級閱讀 419評論 0 0
  • 本文首發(fā)于vivo互聯(lián)網(wǎng)技術(shù)微信公眾號https://mp.weixin.qq.com/s/JFSDqI5yaOc...