我只是在我最近使用PHP ADODB庫轉換爲PDO的應用程序之一改進了一些代碼。在adodb啓動事務後,如果在begin和commit命令之間發生查詢時出現異常,它將自動回滾。PHP PDO事務自動rollBack
PDO是否也這樣做。如果一個有查詢的方法在PDO的開始和提交之間失敗,trsaction會自動回滾還是需要隱式調用?
我只是在我最近使用PHP ADODB庫轉換爲PDO的應用程序之一改進了一些代碼。在adodb啓動事務後,如果在begin和commit命令之間發生查詢時出現異常,它將自動回滾。PHP PDO事務自動rollBack
PDO是否也這樣做。如果一個有查詢的方法在PDO的開始和提交之間失敗,trsaction會自動回滾還是需要隱式調用?
你必須自己調用回滾(並提交),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將自動回滾。
那麼該交易將可能得到取決於你的應用程序回滾(也許你有一個甚至聽衆的地方,那將犯下的嗎?)。在發生異常的地方進行顯式回滾可能是一個好主意。
從http://www.php.net/manual/en/pdo.transactions.php:
當腳本結束時,或者當一個連接即將被關閉,如果你有一個未完成的事務,PDO將自動回滾。 ...如果您沒有明確提交事務,則認爲事情出錯了,所以回滾是爲了您的數據的安全性而執行的。
儘管如此,在發生錯誤時顯式回滾事務是一種很好的做法。看到這個問題的更多細節:If an PHP PDO transaction fails, must I rollback() explicitely?
感謝您提供的信息,實際上非常有趣,我正在尋找什麼。不知道我是如何在文檔中錯過的。再次感謝。 – jiraiya
但是...如果你開始事務,做一些插入和更新,然後使ALTER TABLE失敗行大於1,默認行爲是在實踐中提交... MySQL 5.7 。 – 18C
正確,MySQL DDL查詢(如ALTER TABLE,CREATE TABLE等)創建一個隱式提交。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html – chrisguitarguy