2013-05-18 80 views
3

我只是在我最近使用PHP ADODB庫轉換爲PDO的應用程序之一改進了一些代碼。在adodb啓動事務後,如果在begin和commit命令之間發生查詢時出現異常,它將自動回滾。PHP PDO事務自動rollBack

PDO是否也這樣做。如果一個有查詢的方法在PDO的開始和提交之間失敗,trsaction會自動回滾還是需要隱式調用?

回答

5

你必須自己調用回滾(並提交),PDO不會爲你做。類似這樣的:

$pdo = new \PDO(/* ... */); 

$pdo->beginTransaction(); 

try { 
    // do stuff.. 
} catch(\Throwable $e) { // use \Exception in PHP < 7.0 
    $pdo->rollBack(); 
    throw $e; 
} 

$pdo->commit(); 

然而,PDO將rollback any open transactions when a script ends

當腳本結束或連接即將關閉時,如果您有未完成的事務,PDO將自動回滾。

那麼該交易將可能得到取決於你的應用程序回滾(也許你有一個甚至聽衆的地方,那將犯下的嗎?)。在發生異常的地方進行顯式回滾可能是一個好主意。

+0

但是...如果你開始事務,做一些插入和更新,然後使ALTER TABLE失敗行大於1,默認行爲是在實踐中提交... MySQL 5.7 。 – 18C

+0

正確,MySQL DDL查詢(如ALTER TABLE,CREATE TABLE等)創建一個隱式提交。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html – chrisguitarguy

10

http://www.php.net/manual/en/pdo.transactions.php

當腳本結束時,或者當一個連接即將被關閉,如果你有一個未完成的事務,PDO將自動回滾。 ...如果您沒有明確提交事務,則認爲事情出錯了,所以回滾是爲了您的數據的安全性而執行的。

儘管如此,在發生錯誤時顯式回滾事務是一種很好的做法。看到這個問題的更多細節:If an PHP PDO transaction fails, must I rollback() explicitely?

+0

感謝您提供的信息,實際上非常有趣,我正在尋找什麼。不知道我是如何在文檔中錯過的。再次感謝。 – jiraiya