我们经常得到错误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)
table 中的记录A
可能包含一个值,A.a
并且A.b
两者可能会或可能不会引用 table 中的同一记录B
。假设死锁发生在表A的插入上,死锁的原因是否是由于同一张表两次获得锁?如果我们根据 的值将表拆分B
为表B
和表,死锁的数量会减少吗?在您的回答中,请不要争论糟糕的设计。B'
type