所以,我有一个运行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;关闭几个百分点而不是死锁。)