MySQL innoDB 间隙锁产生的死锁问题 | 京东云技术团队

💡 原文中文,约3300字,阅读约需8分钟。
📝

内容提要

本文讨论了在线上经常出现死锁问题的背景下,通过代码分析和问题还原的方式排查问题。两个事务必须都完成update操作,才能执行insert操作,否则会出现死锁。介绍了InnoDB的三种行锁算法和间隙锁的副作用,以及如何避免更新或删除不存在的记录导致死锁问题。从代码级别上加锁可以从根本上解决问题,但会降低并发性。

🎯

关键要点

  • 线上经常出现死锁问题,尤其在处理同一表的多个事务时。

  • 两个事务必须都完成update操作,才能执行insert操作,否则会出现死锁。

  • InnoDB的行锁算法包括Record Lock、Gap Lock和Next-Key Lock。

  • 间隙锁用于防止幻读,但会导致死锁,特别是在Repeated-Read隔离级别下。

  • 没有索引时,update会导致行锁升级为表锁,降低并发性。

  • 更新或删除不存在的记录容易导致死锁,建议避免此类操作。

  • 从代码级别加锁可以根本解决死锁问题,但会降低并发性。

➡️

继续阅读