【发布时间】:2013-05-21 15:39:18
【问题描述】:
我们经常收到错误SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction。一些网站通过简单地使用 try/catch 重试来显示解决方案,例如 MySQL Deadlock Detection via PHP。
我现在的问题是;表设计在多大程度上导致了这种死锁的发生?特别是我对以下示例感兴趣。
Table A
- id (int, primary key)
- a (int, foreign key -- references B.a)
- b (int, foreign key -- also references B.a)
Table B
- id (int, primary key)
- type (enum)
- a (int)
表A 中的记录可能包含A.a 和A.b 的值,这两个值可能引用也可能不引用表B 中的相同记录。假设死锁发生在表 A 中的一次插入操作中,死锁的原因是否是由于同一张表两次获得了锁?如果我们根据type 的值将表B 拆分为表B 和表B',死锁的数量会减少吗?在您的回答中,请不要争论糟糕的设计。
【问题讨论】: