PDO误报死锁

问题描述 投票:1回答:1

我们正在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主键。故事是:

  1. 第一笔交易:将行插入表x1;
  2. 第二笔交易:TRUNCATE表x2; (等待锁定)
  3. 第一笔交易:更新表x1上的插入行;
  4. 第三步导致死锁。即使来自表x1插入行的主键实际上不在表x2中。表x2只是引用x1。

我们正在PHP 7.0和MariaDB 10.0上运行基本的Web应用程序。每个查询都通过PDO类进入数据库。问题在于PDO有时会引发死锁异常:SQLSTATE [40001]:...

php mysql pdo mariadb deadlock
1个回答
0
投票

如果您是TRUNCATEing,请替换内容,然后更改为:

© www.soinside.com 2019 - 2024. All rights reserved.