Php PDO假阳性死锁
我们正在PHP7.0和MariaDB 10.0上运行基本web应用程序。每个查询都通过PDO类进入数据库 问题是PDO有时会引发死锁异常: SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务 但是当我使用ShowEngine INNODB STATUS查看MariaDB中的死锁规范时,最后一个死锁并不是真正的最后一个死锁。例如,图中显示了2019-10-01的死锁,但PDO在2019-10-05向我发出了最后一次死锁警报。好像PDO在弥补僵局。但是,也不是每次都这样。当显示引擎Innodb状态中未显示最后一个死锁时,MariaDB属性Innodb死锁int不会增加 这是发生在这个时候只有一个交易。事务中的所有表都在InnoDB引擎上运行。大约有40个查询选择、更新、插入。MariaDB属性innodb print all死锁处于启用状态。只有一个数据库服务器可连接 PDO只是报告数据库中的所有错误,还是可以弥补死锁?或者这可能是PHP和MariaDB旧版本的问题?我们正计划升级,但不是现在 可以肯定的是,我不是想解决目前的僵局,而是想解决整个反常现象 编辑:我发现,目前的僵局不是由PDO造成的。这是真正的死锁,但问题是在其他事务cron作业中使用TRUNCATE进行查询 详细说明: 假设表x1和表x2引用了x1主键。故事是: 第一个事务:将行插入表x1; 第二个事务:截断表x2;等待锁 第一个事务:更新表x1中插入的行; 第三步导致了僵局。即使表x1的插入行中的主键实际上不在表x2中。表x2只是引用了x1。如果要将截断作为替换内容的一个步骤,请更改为:Php PDO假阳性死锁,php,mysql,pdo,mariadb,deadlock,Php,Mysql,Pdo,Mariadb,Deadlock,我们正在PHP7.0和MariaDB 10.0上运行基本web应用程序。每个查询都通过PDO类进入数据库 问题是PDO有时会引发死锁异常: SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务 但是当我使用ShowEngine INNODB STATUS查看MariaDB中的死锁规范时,最后一个死锁并不是真正的最后一个死锁。例如,图中显示了2019-10-01的死锁,但PDO在2019-10-05向我发出了最后一次死锁警报。好像PDO在弥补僵局。但是,也不是
CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
x TO real;
DROP TABLE old;
如果要将截断作为替换内容的一个步骤,请更改为:
CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
x TO real;
DROP TABLE old;
请参阅以获得总体解决方案谢谢您的回答,但我的问题是MariaDB不记得PDO显示的一些死锁。我知道,僵局是如何产生的。好主要:-DTry设置系统变量。这将打印到MariaDB配置的错误日志中。我已经说过该变量已启用:-我已经检查了MariaDB日志,它与SHOW ENGINE INNODB STATUS相同-死锁不存在。您使用的是事务隔离模式吗?有关整体解决方案,请参阅谢谢您的回答,但我的问题是MariaDB不记得PDO显示的一些死锁。我知道,僵局是如何产生的。好主要:-DTry设置系统变量。这将打印到MariaDB配置的错误日志。我已经说过该变量已启用:-我已检查了MariaDB日志,它与SHOW ENGINE INNODB STATUS相同-死锁不存在。您使用的是事务隔离模式吗?