在mySQL中导致回滚失败错误的原因是什么?
问题描述:
当我尝试执行回滚时出现以下错误。在mySQL中导致回滚失败错误的原因是什么?
回滚失败。没有活动的交易。
我搜索了这个问题,发现一些建议禁用自动提交设置。但我不确定如何做到这一点。上述错误还有其他原因吗?我使用MYSQL和Zend和我的php.ini文件加载所需的驱动程序。
答
默认情况下,MySQL在自动提交中工作。
$connection->setAttribute(Doctrine_Core::ATTR_AUTOCOMMIT, false);
另一个想法我已经是你没有启动事务(应在教义禁止自动提交):你可以把它关掉发现问题
$connection->beginTransaction();
答
.....我呼吁回滚()函数在不同的地方2倍,在代码
答
类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
答
您可以检查是否交易与事务嵌套层存在,那么你可以做回滚
我无法理解如何在评论中发布代码,因此只发布为答案 – rahul 2010-08-04 20:38:59
@ jakub-zalas其中Symfony版本是否支持setAttribute? – 2015-06-11 17:10:19
这与Symfony无关。问题是关于教义1。 – 2015-06-12 06:12:52