作者:杨奇龙
网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
一 背景
死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。
本次分享的死锁案例是 更新不存在的记录加上 X GAP lock 和 insert 的意向锁冲突。希望能够对想了解死锁的朋友有所帮助。
二 案例分析
2.1 业务逻辑
业务逻辑: 业务需要并发不同数据(insert+update),首先是更新记录,如果发现更新的 affect rows 为0,然后就执行插入,如果插入失败,再执行更新。因此存在并发的情况下,两个事务都执行了更新,affect rows 为0,然后有进行并发插入相同记录的情况。
2.2 环境说明
数据库版本 8.0.30
事务隔离级别 REPEATABLE-READ
create table dl(
id int auto_increment primary key,
c1 int not null ,
c2 int not null,
c3 int not null,
unique key uc1(c1),
unique key uc2(c2));
insert into dl(c1,c2,c3) values(2,0 ,2),(5,5,5);

本文通过一个具体的案例,深入分析了MySQL中因并发更新和插入操作导致的死锁现象,并提出了有效的解决方案。
最低0.47元/天 解锁文章
5749

被折叠的 条评论
为什么被折叠?



