我们正在PHP7.0和MariaDB 10.0上运行基本的web应用程序。每个查询都通过PDO类进入数据库。
问题是PDO有时会抛出死锁异常:
SQLSTATE40001:序列化失败:尝试锁定时发现1213死锁;尝试重新启动事务
但是,当我查看MariaDB的死锁规范(使用显示引擎INNODB状态)时,“最后的死锁”并不是真正的最后死锁。例如,显示了2019-10-01年的死锁,但PDO在2019年-10-05年向我发出了最后一次死锁通知。就像PDO在制造死锁。但我再说一遍-不是每次都是。当最后一个死锁没有显示在“显示引擎INNODB状态”中时,MariaDB属性"Innodb死锁“(int)不会增加。
这个时候只发生了一笔交易。事务中的所有表都运行在InnoDB引擎上。大约有40个查询(select、update、insert)。MariaDB属性"innodb打印所有死锁“是打开的。只有一个数据库服务器可供连接。
PDO只是报告数据库中的所有错误,还是可以“弥补死锁”?或者可能是老版本的PHP和MariaDB的问题?我们计划升级,但现在不行。
我并不是想解决目前的僵局,而是这个异常。
编辑:我发现,当前的死锁不是由PDO“弥补”的。这是真正的死锁,但问题是在其他事务(cron作业)中使用“截断”进行查询。
长篇描述:
让我们假设表x1和表x2引用x1主键。故事是:
第三步造成了僵局。尽管插入的表行中的主键x1实际上不在表x2中。表x2只是引用了x1。
发布于 2019-10-17 05:11:10
如果您是TRUNCATEing,作为替换内容的步骤,则更改为:
CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
             x TO real;
DROP TABLE old;https://stackoverflow.com/questions/58336283
复制相似问题