数据库并发insert死锁问题

本文描述了一个简单的业务场景,两个事务在并发执行时因尝试对同一数据范围加锁而引发死锁。文章详细分析了事务执行过程和MySQL的默认临键锁行为,探讨了死锁问题的出现和处理方法。
摘要由CSDN通过智能技术生成

业务逻辑很简单,就是两个不是重复主键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日志如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值