gpt4 book ai didi

php - PDO误报死锁

转载 作者:行者123 更新时间:2023-11-30 21:27:14 30 4
gpt4 key购买 nike

我们在 PHP 7.0 和 MariaDB 10.0 上运行基本的网络应用程序。每个查询都通过 PDO 类进入数据库。

问题是PDO有时会抛出死锁异常:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

但是当我查看 MariaDB 的死锁规范时(使用 SHOW ENGINE INNODB STATUS),“最后的死锁”并不是真正的最后的死锁。例如,从 2019-10-01 开始显示死锁,但 PDO 在 2019-10-05 提醒我最后一个死锁。这就像 PDO 正在弥补僵局。但同样 - 不是每次都这样。并且 MariaDB 属性“Innodb deadlocks”(int)没有增加,当最后一个死锁没有显示在“SHOW ENGINE INNODB STATUS”中时。

此时仅针对一笔交易发生。事务中的所有表都在 InnoDB 引擎上运行。大约有 40 个查询(选择、更新、插入)。 MariaDB 属性“innodb 打印所有死锁”已打开。只有一台数据库服务器可用于连接。

PDO 只是报告数据库中的所有错误还是它可以“弥补死锁”?还是旧版本的 PHP 和 MariaDB 的问题?我们正计划升级,但不是现在。

可以肯定的是 - 我不是要解决当前的僵局,而是要解决整个异常。


编辑:我发现当前的僵局不是由 PDO“弥补”的。这是真正的死锁,但问题是在其他事务(cron 作业)中使用“TRUNCATE”进行查询。

详细描述:

假设表 x1 和表 x2 引用 x1 主键。故事是:

  1. 第一笔交易:向表x1中插入行;
  2. 第二个事务:TRUNCATE 表 x2; (等待锁定)
  3. 第一笔交易:更新表x1的插入行;

而第三步造成了死锁。即使来自表 x1 的插入行的主键实际上并不在表 x2 中。表 x2 只是引用 x1。

最佳答案

如果您将 TRUNCATEing 作为替换内容的一个步骤,则更改为:

CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
x TO real;
DROP TABLE old;

关于php - PDO误报死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336283/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com