首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PDO假正死锁

PDO假正死锁
EN

Stack Overflow用户
提问于 2019-10-11 07:30:22
回答 1查看 378关注 0票数 1

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

  1. first transaction:将行插入表x1;
  2. 第二事务:截断表x2;(等待锁定)
  3. 第一事务:更新表x1处插入的行;

第三步造成了僵局。尽管插入的表行中的主键x1实际上不在表x2中。表x2只是引用了x1。

EN

回答 1

Stack Overflow用户

发布于 2019-10-17 05:11:10

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

代码语言:javascript
运行
复制
CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
             x TO real;
DROP TABLE old;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58336283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档