我们通常会有这样的一个场景先查询有没有数据,然后进行插入或更新。
例如有如下场景,id为主键列
client1
start TRANSACTION;
select * from `user` where id = 2 for UPDATE;
client2
start TRANSACTION;
select * from `user` where id = 3 for UPDATE;
此时client2会等待client1已经加上的gap锁。
client1
insert into `user`(`id`, `name`) value (2, 'name2');
client2
insert into `user`(`id`, `name`) value (3, 'name3');
此时发生了死锁。