2010-08-04 104 views
4

当我尝试执行回滚时出现以下错误。在mySQL中导致回滚失败错误的原因是什么?

回滚失败。没有活动的交易。

我搜索了这个问题,发现一些建议禁用自动提交设置。但我不确定如何做到这一点。上述错误还有其他原因吗?我使用MYSQL和Zend和我的php.ini文件加载所需的驱动程序。

回答

3

默认情况下,MySQL在自动提交中工作。

$connection->setAttribute(Doctrine_Core::ATTR_AUTOCOMMIT, false); 

另一个想法我已经是你没有启动事务(应在教义禁止自动提交):你可以把它关掉发现问题

$connection->beginTransaction(); 
+0

我无法理解如何在评论中发布代码,因此只发布为答案 – rahul 2010-08-04 20:38:59

+0

@ jakub-zalas其中Symfony版本是否支持setAttribute? – 2015-06-11 17:10:19

+0

这与Symfony无关。问题是关于教义1。 – 2015-06-12 06:12:52

0

.....我呼吁回滚()函数在不同的地方2倍,在代码

1

UnitOfWork.php具有类似于catch块:

catch (Exception $e) { 
      $this->em->close(); 
      $conn->rollback(); 

      throw $e; 
} 

当然,如果你的类没有准备好找到一个已经关闭的实体管理器,并因此连接,你将有这个例外。最糟糕的是它掩盖了异常的根本原因,因为错误是在执行catch块之前引起的。为了解决这个问题,你可以在类的catch块做了简单的检查:

$this->em->getConnection()->getTransactionNestingLevel() 

如果嵌套层次grather比0存在:

catch(Exception $e) { 
    if($conn->isTransactionActive()) { 
     [rollback] 
     [close] 
     [rethrow] (if necessary) 
    } 

} 
+1

+1。不应该把[重新抛出]放在if语句之外吗?这样,即使没有活动事务,异常也会重新生成。 – 2014-11-04 01:36:20

0

您可以检查是否交易与事务嵌套层存在,那么你可以做回滚

相关问题