我们正在PHP 7.0和MariaDB 10.0上运行基本的Web应用程序。每个查询都通过PDO类进入数据库。
问题是PDO有时会引发死锁异常:
SQLSTATE [40001]:序列化失败:1213尝试获取锁时发现死锁;尝试重新启动事务
但是当我查看MariaDB的死锁规范时(使用SHOW ENGINE INNODB STATUS),“最后的死锁”并不是真正的最后的死锁。例如,显示了从2019-10-01开始的死锁,但PDO提醒我上次出现死锁的时间为2019-10-05。就像PDO造成了僵局一样。但是再次-不是每次都这样。当“ SHOW ENGINE INNODB STATUS”中未显示最后一个死锁时,MariaDB属性“ Innodb死锁”(int)不会增加。
目前仅发生一笔交易。事务中的所有表都在InnoDB引擎上运行。它大约有40个查询(选择,更新,插入)。 MariaDB属性“ innodb打印所有死锁”已打开。只有一台数据库服务器可用于连接。
PDO是只是报告数据库中的所有错误,还是可以“弥补死锁”?还是可能是旧版本的PHP和MariaDB的问题?我们正计划升级,但目前不升级。
并且可以肯定的是-我不是要解决当前的僵局,而是要解决整个异常。
编辑:我发现,当前的僵局不是PDO所“弥补”的。这是真正的僵局,但问题是在其他事务(定时作业)中使用“ TRUNCATE
”进行查询。详细说明:
假定表x1和表x2引用x1主键。故事是:
第三步导致死锁。即使来自表x1插入行的主键实际上不在表x2中。表x2只是引用x1。
我们正在PHP 7.0和MariaDB 10.0上运行基本的Web应用程序。每个查询都通过PDO类进入数据库。问题在于PDO有时会引发死锁异常:SQLSTATE [40001]:...
如果您是TRUNCATEing
,请替换内容,然后更改为: