mysql版本
select version();
表数据情况
索引情况
情况一,针对主键进行操作
事务一
start transaction;
select id,a,b,c from next_key_lock_test where id = 5 for update;
事务二
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的数据不收到影响
情况二针对唯一索引a操作
事务一
start transaction;
select id,a,b,c from next_key_lock_test where a = 5 for update;
事务二
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的数据时,被锁住了。
情况三针对唯一索引a操作,where条件不存在
事务一
start transaction;
select id,a,b,c from next_key_lock_test where a = 4 for update;
事务二
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被锁住了
表data_lock_waits
查看表data_locks
添加了一个gap锁
测试发现(1,4]被锁住了,5由于是唯一索引直接插入不进去。
情况四 针对主键不存在的情况
事务一
start transaction;
select id,a,b,c from next_key_lock_test where id = 4 for update;
这次LOCK_DATA只有一个5
事务二
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的数据
基本与情况3一致,无法插入[2,4]的数据,1、5因为重复主键无法插入。
情况五 对普通索引进行操作
事务一
start transaction;
select id,a,b,c from next_key_lock_test where b = 4 for update;
事务二
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的数据
基本与情况三一致
由于不存在唯一校验,试一下边界
事务二
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,5,3);
无法插入边界值5
也无法插入边界值1
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (100,100,1,100);
边界为[0,5]
情况六不带索引的字段
事务一
start transaction;
select id,a,b,c from next_key_lock_test where c = 4 for update;
发现任意数据都无法插入,应该是记录中多了一条
的原因。
共享锁 lock in share mode效果基本一致,只是X变为S。