这是MysqL级表锁定中的问题。
在InnoDB内部,FOREIGN KEY约束检查可以读取(或使用ON UPDATE或ON DELETE子句写入)父表或子表。
通常,表访问由以下锁控制:1. MysqL元数据锁2. InnoDB表锁3. InnoDB记录锁
所有这些锁将保留到事务结束。
在某些模式下会跳过InnoDB表和记录锁,但在外键检查期间不会跳过。造成死锁的原因是,MysqL仅获取sql语句中明确提及的表的元数据锁。
我猜想,一种解决方法可能是在事务开始前,在有问题的FOREIGN KEY操作之前访问子表(或父表)。