2010-08-04 105 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

您可以檢查是否交易與事務嵌套層存在,那麼你可以做回滾

相關問題