Symfony 原则设置自动提交(错误)方法和;没有活动的交易”;消息

Symfony 原则设置自动提交(错误)方法和;没有活动的交易”;消息,symfony,exception,doctrine-orm,transactions,Symfony,Exception,Doctrine Orm,Transactions,编辑:问题是为什么使用setAutoCommit(false)是“没有活动事务”异常的解决方案忘记这个问题,因为这不是正确的解决方案(至少在我的情况下)。我将把这个问题留在这里,以防有人遇到同样的问题。有关更多详细信息,请参见下面的答案 ================ 以下代码在Symfony 2.7中运行良好,但在更新到Symfony 2.8(以及最新的DoctrineBundle版本)后,将引发一个没有活动事务异常: private function getSynchronization(

编辑:问题是为什么使用
setAutoCommit(false)
是“没有活动事务”异常的解决方案忘记这个问题,因为这不是正确的解决方案(至少在我的情况下)。我将把这个问题留在这里,以防有人遇到同样的问题。有关更多详细信息,请参见下面的答案

================

以下代码在Symfony 2.7中运行良好,但在更新到Symfony 2.8(以及最新的
DoctrineBundle
版本)后,将引发一个
没有活动事务
异常:

private function getSynchronization() {
    $lock_repo = $this->entityManager->getRepository('MyAppBundle\Entity\DBLock');

    $this->entityManager->getConnection()->beginTransaction();

    try {
        $sync = $lock_repo->findOneByUser($this->getUser());

        if (!$lock) {
            $lock = new DBLock();
        } else {
            if ($lock->isActive()) {
                // ... Exception: Process already running
            }
            $expected_version = $lock->getVersion();
            $this->entityManager->lock($lock, LockMode::OPTIMISTIC, $expected_version);
        }

        $sync->setActive(false);

        $this->entityManager->persist($sync);
        $this->entityManager->flush();

        $this->entityManager->getConnection()->commit();

        // EXCEPTION on this line
        $this->entityManager->lock($lock, LockMode::NONE);
    }
    catch(\Exception $e) {
        $this->entityManager->getConnection()->rollback();
        throw new ProcessException($e->getMessage());
    }

    ...
}
经过一番搜索,我在一个问题上找到了解决办法。添加以下行后,一切正常:

private function getSynchronization() {
    $lock_repo = $this->entityManager->getRepository('MyAppBundle\Entity\DBLock');

    $this->entityManager->getConnection()->beginTransaction();

    // ADDED LINE
    $this->entityManager->getConnection()->setAutoCommit(false);

    try {
        ...
因此,问题不在于如何解决问题,而在于解决方案如何运作……

我对
setAutoCommit()
方法的用法感到非常困惑:

要使连接自动在上打开新事务,请执行以下操作:
connect()
并且在
commit()
rollBack()
之后,您可以禁用 带有
setAutoCommit(false)

我不明白这一点。

这是否意味着,使用
beginTransaction()
启动/创建的事务现在在使用
commit()
时自动关闭?因此,为了能够在使用
commit()
之后使用
lock(…)
,我必须首先开始一个新事务。我可以通过再次调用
beginTransaction()
手动执行此操作,也可以通过在之前设置
setAutoCommit(false)
自动执行此操作对吗?

这是最新学说版本的变化吗?我在更新说明中没有找到任何相关内容,在Symfony/doctor更新之前,代码运行得很好


多谢各位

如前所述,我遇到了一个问题,调用
lock($lock,LockMode::NONE)
突然抛出了一个
在从原则2.4更新到2.5之后没有活动事务的异常

我的解决方案是添加
setAutoCommit(false)
,它在调用
commit()
后自动创建一个新事务。它起作用了,异常不再发生然而,这不是真正/正确的解决方案,它会产生其他问题作为副作用

重新阅读后,我发现正确的解决方案是使用
lock($lock,null)
而不是
lock($lock,LockMode::NONE)
。这是BC第2.4条和第2.5条之间的突破


也许我的问题和回答能帮助其他遇到同样问题的人

如前所述,我遇到了一个问题,调用
lock($lock,LockMode::NONE)
突然抛出了一个
在从原则2.4更新到2.5之后没有活动事务的异常

我的解决方案是添加
setAutoCommit(false)
,它在调用
commit()
后自动创建一个新事务。它起作用了,异常不再发生然而,这不是真正/正确的解决方案,它会产生其他问题作为副作用

重新阅读后,我发现正确的解决方案是使用
lock($lock,null)
而不是
lock($lock,LockMode::NONE)
。这是BC第2.4条和第2.5条之间的突破


也许我的问题和回答能帮助其他遇到同样问题的人

我可以问一下使用
setautocommit(false)
有什么副作用吗?我可以问一下使用
setautocommit(false)
有什么副作用吗?