這三種並不是鎖,而是鎖的演算法。它們的共同特點是互斥的。
間隙鎖和臨鍵鎖只有在rr級別中才能生效。
set global transaction isolation level repeatable read;
select @@global.tx_isolation;
間隙鎖的目的是為了防止多個事務把記錄插入到同一範圍中去,這樣能防止幻讀
間隙鎖可能會出現在唯一索引和輔助索引,現在分情況討論。
一 唯一索引
select * from fruit where id = 50 for update; # 記錄鎖
select * from fruit where id between 30 and 50 for update;
臨界鎖 [30, 50] , [50, 55]
insert into fruit select 29, 'mango', 50; # 成功
insert into fruit select 33, 'mango', 50; # 阻塞
insert into fruit select 51, 'mango', 50; # 阻塞
insert into fruit select 58, 'mango', 50; # 成功
update fruit set num = num -1 where id = 55; #阻塞
select * from fruit where id = 20 for update;
(15, 30)
insert into fruit select 16,'mango', 100; # 阻塞
insert into fruit select 25,'mango', 100; #阻塞
insert into fruit select 13 ,'mango', 100; #成功
insert into fruit select 33 ,'mango', 100; #阻塞
update fruit set num = num -1 where id = 15; #成功
update fruit set num = num -1 where id = 30; #成功
二 普通索引
select * from fruit where num = 80 for update;
普通索引 (60, 90) 主鍵(40 ,60)
insert into fruit select 100,'mang0',70; #阻塞
insert into fruit select 51,'mang0', 1; #成功
insert into fruit select 41,'mang0',60; #阻塞
insert into fruit select 39,'mang0',60; #成功
insert into fruit select 59,'mang0',90; #阻塞
insert into fruit select 61,'mang0',90; #成功
update fruit set name = 'mango' where id = 40; #成功
update fruit set num = num -1 where id = 40; #成功
update fruit set name = 'mango' where id = 60; #成功
update fruit set num = num -1 where id = 40; # 失敗
update fruit set num = num -1 where id = 70; # 失敗
update fruit set num = num -1 where id = 100; #成功
select * from fruit where num = 70 for update;
insert into fruit select 41 , 'mango', 61; # 阻塞
其餘情況與唯一索引類似
mysql臨鍵鎖 innodb臨鍵鎖鎖定範圍
臨鍵鎖解決當前讀的幻讀問題 通過鎖定範圍,使另外乙個事務不能插入 mvcc解決不加鎖讀的幻讀問題。create table test id int,grade char 1 name varchar 20 primary key id key grade idx grade engine innod...
資料庫行鎖 表鎖 記錄鎖 間隙鎖 臨鍵鎖
行鎖就是一次鎖一行或者多行記錄,mysql的行鎖是基於索引載入的,所以行鎖是要加在索引響應的行上,即命中索引。假設 table的b列為索引字段,則以下更新語句只會鎖b b 的行 update table set a a where b b 行鎖的特徵 鎖衝突概率低,併發性高,但是會有死鎖的情況出現。...
mysql間隙鎖 mysql間隙鎖
前面一文 mysql鎖 介紹了mysql innodb儲存引擎的各種鎖,本文介紹一下innodb儲存引擎的間隙鎖,就以下問題展開討論 1.什麼是間隙鎖?間隙鎖是怎樣產生的?2.間隙鎖有什麼作用?3.使用間隙鎖有什麼隱患?一 間隙鎖的基本概念 1.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...