关于InnoDB表结合LOCK TABLES与autocommit=0的死锁检测疑问
关于InnoDB表LOCK TABLES操作的死锁检测理解纠正
你的理解存在部分偏差,结合MySQL官方文档的规则,具体情况如下:
一、死锁检测生效的前提场景
当innodb_table_locks = 1(默认值)且autocommit = 0时,InnoDB的死锁检测仅能覆盖同时涉及InnoDB行锁和MySQL表锁的交叉等待场景,比如:
- 会话A持有
t1的表锁,同时等待会话B持有的t2行锁 - 会话B持有
t2的表锁,同时等待会话A持有的t1行锁
这种交叉等待的死锁会被InnoDB检测到,触发回滚逻辑。
二、无法检测的死锁场景
如果死锁仅涉及LOCK TABLES设置的纯表级锁(无行锁参与),比如:
- 会话A先锁
t1,再尝试锁t2 - 会话B先锁
t2,再尝试锁t1
此时InnoDB的死锁检测机制不会生效,这类死锁只能通过设置innodb_lock_wait_timeout变量,靠超时机制来打破。
三、你的代码示例说明
你给出的单会话LOCK TABLES操作流程本身不会产生死锁,但如果是多会话按类似逻辑交叉申请表锁,且没有行锁参与的话,依然无法触发InnoDB的死锁检测。
内容的提问来源于stack exchange,提问作者user19551894
相关产品推荐
相关产品推荐

