文章预览
1 问题背景 2 MySQL 锁回顾 3 DELETE 流程 4 原因剖析 5 现场还原 6 问题思考 6.1 可以通过 SELECT FOR UPDATE 避免吗 6.2 只有唯一索引会有这个问题吗 6.3 持有记录锁后再请求临键锁为什么需要等待 6.4 高版本的 MySQL 会存在 DELETE 死锁吗 7 事后总结 8 参考 1 问题背景 “哥们,又双叒叕写了个死锁,秀啊!😏” 就算是经常写死锁的同学看到估计都会有点懵,两条一模一样的 DELETE 语句怎么会产生死锁呢? 2 MySQL 锁回顾 看到这里的靓仔肯定对 MySQL 的锁非常了解,哥们还是带大家对锁的分类进行快速回顾; 本文将基于 MySQL 5.7.21 版本进行讨论,该版本使用 InnoDB 存储引擎,并采用 Repeated Read 作为事务隔离级别。 要查看 MySQL 的加锁信息,必须启用 InnoDB 状态监控功能; SET GLOBAL innodb_status_output= ON ; SET GLOBAL innodb_status_output_locks= ON ; 要获取 InnoDB 存储引擎
………………………………