如何在并行更新中找到Postgres / PHP死锁?

时间:2016-02-16 09:37:11

标签: php postgresql doctrine-orm database-deadlocks

所以,我有一个运行PHP / PostgreSQL的在线游戏,其中一个更新过程偶尔会给我带来死记录,如下所示:

  

[2016-02-16 06:35:14] app.ERROR:Doctrine \ DBAL \ DBALException:An   执行' UPDATE PlayerCharacter SET时发生异常   spotting_distance = ?, visibility =? WHERE id =?'与params [2167,   20,128]:SQLSTATE [40P01]:检测到死锁:7错误:死锁   检测到详细信息:进程11691在事务上等待ShareLock   4173974;被进程11706阻止。进程11706等待ShareLock   关于交易4173977;被进程11691阻止。提示:请参阅服务器   记录查询详细信息。

我已尝试查看服务器日志,但它没有帮助。

问题是我不知道这是怎么发生的,因为虽然我可以看到导致它的代码中的确切行,但我不明白它是如何发生的。

代码更新了大量行,这就是我将处理分成6个并行进程的原因,每个进程都更新了总数的一个子集。换句话说:没有其他进程应该使用主ID 128更新行。那么为什么会出现死锁?

我怀疑a)奇怪的事情或b)我的日程安排代码中的错误以及其他一些 更新第128行的过程。

我怎样才能知道发生了什么?我可以说服Doctrine或Postgres向我展示阻止交易吗?我可以以某种方式使交易无阻塞(因为这些是使用相同数学的并行处理,结果应该是相同的,如果由于某种原因它不是,我宁愿得到一个结果&& #39;关闭几个百分点而不是死锁。)

0 个答案:

没有答案