mysql臨鍵鎖 innodb臨鍵鎖鎖定範圍

2021-10-20 22:55:39 字數 1761 閱讀 3379

臨鍵鎖解決當前讀的幻讀問題(通過鎖定範圍,使另外乙個事務不能插入),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;

參考:

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就不去阻塞它了)

mysql 臨鍵鎖 記錄鎖 間隙鎖 臨鍵鎖

這三種並不是鎖,而是鎖的演算法。它們的共同特點是互斥的。間隙鎖和臨鍵鎖只有在rr級別中才能生效。set global transaction isolation level repeatable read select global.tx isolation 間隙鎖的目的是為了防止多個事務把記錄插入...

資料庫行鎖 表鎖 記錄鎖 間隙鎖 臨鍵鎖

行鎖就是一次鎖一行或者多行記錄,mysql的行鎖是基於索引載入的,所以行鎖是要加在索引響應的行上,即命中索引。假設 table的b列為索引字段,則以下更新語句只會鎖b b 的行 update table set a a where b b 行鎖的特徵 鎖衝突概率低,併發性高,但是會有死鎖的情況出現。...

mysql臨時表僅對當前使用者 mysql臨時表問題

1 使用者上傳txt文件到 2 對txt文件進行處理,得到建立的臨時表 txt文件的時間性很短,只持續3個小時作用,所以選了臨時表 3 使用者輸入不同的操作,根據臨時表查詢後返回相應的結果。比如使用者輸入查詢名字叫張三,就返回張三的資訊,輸入李四就返回李四的資訊 4 使用者退出登入後,或關閉網頁後,...