innodb臨鍵鎖鎖定范圍


臨鍵鎖解決當前讀的幻讀問題(通過鎖定范圍,使另外一個事務不能插入),mvcc解決不加鎖讀的幻讀問題。

create table test(
`id` int,
`grade` char(1),
`name` varchar(20),
primary key (`id`),
key grade_idx (`grade`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


insert into test values(1,'a','xiaoa');
insert into test values(4,'e','xiaoe');
insert into test values(8,'l','xiaol');
insert into test values(12,'o','xiaoo');
insert into test values(16,'r','xiaor');
insert into test values(20,'u','xiaou');
insert into test values(24,'w','xiaow');
insert into test values(28,'z','xiaoz');

#############################
insert into test values(1,'a','xiaoa'); (-,a]
insert into test values(4,'e','xiaoe'); (a,e]
insert into test values(8,'l','xiaol'); (e,l]
insert into test values(12,'o','xiaoo'); (l,o]
insert into test values(16,'r','xiaor'); (o,r]
insert into test values(20,'u','xiaou'); (r,u]
insert into test values(24,'w','xiaow'); (u,w]
insert into test values(28,'z','xiaoz'); (w,z]
                (z,+)

innodb 默認才用臨鍵鎖,
如果查詢沒有命中索引,則退化為表鎖;
如果等值查詢唯一索引且命中唯一1條記錄,則退化為行鎖;
如果等值查詢唯一索引且沒有命中記錄,則退化為臨近結點的間隙鎖;

如果范圍查詢唯一索引或查詢非唯一索引且命中記錄,則鎖定所有命中行的臨鍵鎖 ,並同時鎖定最大記錄行下一個區間的間隙鎖。
如果范圍查詢非唯一索引且沒有命中記錄,退化為臨近結點的間隙鎖(包括結點也被鎖定)。

 

注意:被鎖定的范圍其他事務無法進行插入和刪除操作,但可以select..for update;

參考:https://www.cnblogs.com/crazylqy/p/7773492.html

session 2(id=3可插入;id=108無法插入,存在gap lock;id=123的記錄無法select..in share mode,因為該記錄上存在record lock;id=125可以被select..in share mode和update,這點比較奇怪,應該這也算是當前讀,不過后來查看官方文檔得知,gap鎖只會阻塞insert操作,因為gap間隙中是不存在任何記錄的,除了insert操作,其他的操作結果應該都等價於空操作,mysql就不去阻塞它了)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM