mysql版本
select version();
image.png
表數(shù)據(jù)情況
image.png
索引情況
image.png
情況一箩退,針對主鍵進(jìn)行操作
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where id = 5 for update;
事務(wù)二
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (6,6,6,6);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (4,4,4,4);
commit;
插入id為6甩苛、4的數(shù)據(jù)不收到影響
情況二針對唯一索引a操作
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where a = 5 for update;
事務(wù)二
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (88,5,3,3);
rollbock;
插入a為7、3不受影響到踏,插入a=5的數(shù)據(jù)時杠袱,被鎖住了。
情況三針對唯一索引a操作,where條件不存在
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where a = 4 for update;
事務(wù)二
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);
插入3被鎖住了
image.png
表data_lock_waits
image.png
查看表data_locks
image.png
添加了一個gap鎖
測試發(fā)現(xiàn)(1,4]被鎖住了,5由于是唯一索引直接插入不進(jìn)去窝稿。
情況四 針對主鍵不存在的情況
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where id = 4 for update;
image.png
這次LOCK_DATA只有一個5
事務(wù)二
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);
同樣插入不了id為3的數(shù)據(jù)
基本與情況3一致楣富,無法插入[2,4]的數(shù)據(jù),1伴榔、5因為重復(fù)主鍵無法插入纹蝴。
情況五 對普通索引進(jìn)行操作
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where b = 4 for update;
事務(wù)二
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);
同樣無法插入3的數(shù)據(jù)
image.png
基本與情況三一致
由于不存在唯一校驗,試一下邊界
事務(wù)二
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,5,3);
無法插入邊界值5
image.png
也無法插入邊界值1
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (100,100,1,100);
邊界為[0,5]
情況六不帶索引的字段
事務(wù)一
start transaction;
select id,a,b,c from next_key_lock_test where c = 4 for update;
image.png
發(fā)現(xiàn)任意數(shù)據(jù)都無法插入踪少,應(yīng)該是記錄中多了一條
image.png
的原因塘安。
共享鎖 lock in share mode效果基本一致,只是X變?yōu)镾援奢。