业务逻辑很简单,就是两个不是重复主键insert语句,在两个事务中,产生死锁
数据库结构如下:
数据库数据如下:
两条insert语句如下:
INSERT INTO student (id, name, age) VALUES ('5', 'E', 5);
INSERT INTO student (id, name, age) VALUES ('4', 'D', 4);
事务执行情况如下:
事务1 | 事务2 |
---|---|
BEGIN | |
SELECT * FROM student WHERE id = ‘5’ FOR UPDATE; 对id(3,5]数据范围加锁 | BEGIN |
SELECT * FROM student WHERE id = ‘4’ FOR UPDATE; 对id(3,5]数据范围加锁 | |
INSERT INTO student (id, name, age) VALUES (‘5’, ‘E’, 5); 阻塞等待 | |
INSERT INTO student (id, name, age) VALUES (‘4’, ‘D’, 4); 检测到死锁 | |
回滚事务 | |
COMMIT; 执行成功 |
两个事务都可以先后锁定 (3, 5]这个范围,MySQL默认加的临键锁的范围是可以交叉的
mysql日志如下: