HOLDS THE LOCK(S) : 该事务持有两个S锁,其中一个锁在索引idx_displaydataid的 MX4TYZIKTKSZCAABAAAAAAY8fw_4 位置上
WAITING FOR THIS LOCK TO BE GRANTED : 该事务在等待索引idx_displaydataid的MX4TYXYKTJ6VKAABAAAAADY8m462位置上,等待一个X锁
2)事务2
HOLDS THE LOCK(S) : 该事务持有两个S锁,其中一个锁在索引idx_displaydataid的 MX4TYXYKTJ6VKAABAAAAADY8m462 位置上
WAITING FOR THIS LOCK TO BE GRANTED : 该事务在等待索引idx_displaydataid的MX4TYZIKTKSZCAABAAAAAAY8fw_4一个X锁
死锁原因看起来比较清楚,锁互斥且循环等待,造成了死锁。
1.3 死锁疑点
随着我仔细分析上面的日志,发现又不是那么简单,或者说有几个疑点困惑:
Question1: gap before rec 表示一个间隙锁,我们数据库的隔离级别是 RC,怎么还有间隙锁?
Question2: gap before rec insert intention好像叫插入意向锁,到底是个啥?
Question3: INSERT语句,到底有几把锁?为什么会获得S锁?
2、死锁答疑
2.1 为什么RC级别下还有间隙锁?
网上很多博客视频都会说RC级别下间隙锁会失效,然后搬出官方文档的原话:
Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED or enable the innodb_locks_unsafe_for_binlog system variable (which is now deprecated).
但是,官方文档后面还有一句:
In this case, gap locking is disabled for searches and index scans and is used only for foreign-key constraint checking and duplicate-key checking.
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。