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)
有什么副作用吗?