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

2021-10-19 00:11:01 字數 1956 閱讀 9004

這三種並不是鎖,而是鎖的演算法。它們的共同特點是互斥的。

間隙鎖和臨鍵鎖只有在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.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...