什么导致mySQL中的回滚失败错误?

时间:2010-08-04 03:57:51

标签: php mysql transactions doctrine

尝试执行回滚时出现以下错误。

  

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

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

4 个答案:

答案 0 :(得分:3)

默认情况下,MySQL在自动提交中工作。您可以使用以下命令将其关闭:

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

我的另一个想法是你没有启动事务(它应该禁用Doctrine中的自动提交):

$connection->beginTransaction();

答案 1 :(得分:1)

UnitOfWork.php 有一个类似于以下的catch块:

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

            throw $e;
}

当然,如果您的类尚未准备好找到已经关闭的实体管理器并因此找到连接,那么您将遇到此异常。最糟糕的是它掩盖了异常的根本原因,因为错误是在catch块执行之前引起的。要修复它,你可以在你的班级'catch block:

中进行简单的检查
catch(Exception $e) {
    if($conn->isTransactionActive()) {
         [rollback]
         [close]
         [rethrow] (if necessary)
    }

}

答案 2 :(得分:0)

发现问题.....我在代码中的不同位置调用了rollback()函数2次

答案 3 :(得分:0)

您可以检查事务是否存在事务嵌套级别:

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

如果嵌套级别不是0,那么你可以进行回滚