【问题标题】:Doctrine2 dead lock - how to handleDoctrine2死锁——如何处理
【发布时间】:2014-05-01 09:33:50
【问题描述】:

在我正在处理的 symfony2 项目中,有时在我的 entitymanager 上调用 flush 时会发生死锁。这会导致异常。大多数情况下,此错误只发生一次,第二次尝试插入相同数据时正常工作。

是否有再次执行(刷新)相同事务的好方法。就这么简单

$em->flush();

不会这样做,因为如果发生错误,实体管理器会关闭。

我发现 https://github.com/doctrine/doctrine2/pull/806 位不提供解决方案。

【问题讨论】:

    标签: mysql doctrine-orm deadlock


    【解决方案1】:

    Doctrine 会针对此类错误抛出 RetryableException,您只需再尝试一次即可使其正常工作。

    问题在于,在 Doctrine 2 中,这些异常使 EntityManager 无法使用,您必须重新实例化一个新的。

    希望这将在教义 3 中得到纠正:issue tracking

    在 Doctrine 3 发布之前,我采用的解决方案在我公司的生产项目中通过了时间的考验。一切都在这个blog post中解释了

    【讨论】:

      【解决方案2】:

      我会使用explicit transaction demarcation,希望能从一开始就防止死锁。默认情况下,只有flush() 包含在事务中。

      或者,您可以更改您的过程以使用 DQL UPDATE 查询,该查询应该是原子的。

      或者将请求重新提交回操作(有一些递归限制)。

      我不确定是否有重新启动实体管理器的好方法,但保留工作单元。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多