在我正在处理的一个symfony2项目中,当对我的entitymanager调用flush时,有时会发生死锁。这会导致异常。大多数情况下,此错误只发生一次,第二次尝试插入相同的数据是正确的。
有没有好的方法来再次执行(刷新)相同的事务。很简单
$em->flush();不会这样做,因为如果发生错误,entitymanager将被关闭。
我发现https://github.com/doctrine/doctrine2/pull/806 bit不能提供解决方案。
发布于 2018-10-09 15:58:51
Doctrine为这种错误抛出了一个RetryableException,你只需再试一次就能让它工作。
问题是,在Doctrine 2中,这些异常使EntityManager不可用,您必须重新实例化一个新的。
希望这将在原则3中得到纠正:issue tracking
在Doctrine 3发布之前,我选择了一个在我公司的生产项目中通过时间测试的解决方案。所有内容都在此blog post中进行了解释
发布于 2017-01-05 11:26:07
我会使用explicit transaction demarcation,希望能从一开始就防止死锁。默认情况下,只有flush()封装在事务中。
或者,您也可以更改过程以使用DQL UPDATE查询,该查询应该是原子的。
或者将请求重新提交回操作(带有一些递归限制)。
我不确定是否有重启实体管理器的好方法,但保留工作单元。
https://stackoverflow.com/questions/23405203
复制相似问题