我正在试图弄清楚Symfony 2应用程序中导致死锁的原因。我正在运行一个cronjob,它在一个相当大的数据集上进行批量更新,其中一部分导致了这个错误:
Doctrine \ DBAL \ DBALException:执行时发生异常 'UPDATE SpotEvent SET ts = ?, current =? WHERE id =?'与params [“2015-12-28 00:35:27”,1,39316]:SQLSTATE [40P01]:死锁 检测到:7 ERROR:检测到死锁详细信息:进程32030等待 ShareLock on transaction 2130787;被进程32029阻止。进程 32029在交易2130786上等待ShareLock;被进程阻止 32030.提示:请参阅服务器日志以获取查询详细信息。背景:在更新元组(105,68)中关于“spotevent”(未捕获的异常) 在 /home/maf/symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php 运行控制台命令时的第91行
导致它的代码基本上是这样的:
check event
if (already in database) {
update timestamp
} else {
create new
}
从我在错误中看到的,第一个分支导致死锁,但从我读到的关于死锁的内容来看,第二个分支应该更有可能。在任何情况下,我都不明白为什么我会陷入僵局。
我应该说我在6个并行进程中运行这个工作。但是,他们之间没有重叠(即工作一是从1-200检查,工作2从201到400等)。
我正在使用PostgreSQL作为数据库后端。我的“检查事件”步骤是使用DQL完成的,其他一切都是纯粹的ORM。