MySQL innoDB 间隙锁产生的死锁问题 | 京东云技术团队
原文中文,约3300字,阅读约需8分钟。发表于: 。线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶发的,又模拟不出来什么场景会导致死锁,只能进行代码分析,问题还原的方式去排查问题。业务代码简化成下面也就是说先update ,select , insert 这么一个顺序表中存在dm_code ,erp 唯一索引。
本文讨论了在线上经常出现死锁问题的背景下,通过代码分析和问题还原的方式排查问题。两个事务必须都完成update操作,才能执行insert操作,否则会出现死锁。介绍了InnoDB的三种行锁算法和间隙锁的副作用,以及如何避免更新或删除不存在的记录导致死锁问题。从代码级别上加锁可以从根本上解决问题,但会降低并发性。