Analysis of a GreatSQL Deadlock Case

💡 原文英文,约1700词,阅读约需6分钟。
📝

内容提要

本文介绍了一个数据库死锁问题的复现和原因分析。通过业务程序日志和业务流程,发现死锁是由于两个业务交替执行的delete和insert操作导致的。当delete的数据存在时,不会产生死锁;当delete的数据不存在时,会产生死锁。建议业务逻辑修改为先判断数据是否存在,存在则先删除再插入,不存在则直接插入。

🎯

关键要点

  • 客户业务产生死锁的报错,死锁原因是两个业务交替执行的delete和insert操作。
  • 当delete的数据存在时,不会产生死锁;当delete的数据不存在时,会产生死锁。
  • 建议业务逻辑修改为先判断数据是否存在,存在则先删除再插入,不存在则直接插入。
  • 在测试中,创建了一个包含唯一键的表,并插入了数据。
  • 当delete的数据存在时,两个业务可以正常执行,不会产生死锁。
  • 当delete的数据不存在时,业务1和业务2都尝试加锁,导致死锁发生。
  • 死锁的产生主要是由于GAP锁和插入意向锁的冲突。
  • 建议在执行delete操作前先进行数据存在性检查,以避免死锁。
🏷️

标签

➡️

继续阅读