Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO假阳性死锁_Php_Mysql_Pdo_Mariadb_Deadlock - Fatal编程技术网

Php PDO假阳性死锁

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在弥补僵局。但是,也不是

我们正在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。

如果要将截断作为替换内容的一个步骤,请更改为:

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相同-死锁不存在。您使用的是事务隔离模式吗?