如果拋出數據庫異常,PDO的inTransaction()
仍然在事務中返回false。這可能特定於使用PostgreSQL。例如PDO inTransaction()在數據庫異常後返回false
try {
$pdo->beginTransaction();
$pdo->exec('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
// ...
// Cause any PDO exception
// ...
$pdo->commit();
} catch (\Exception $e) {
if ($pdo->inTransaction()) {
// Never gets here
$pdo->rollback();
}
throw $e;
}
事務完全沒有結束,因爲如果我啓動另一個事件,我會得到一個異常,表明事務正在進行。我沒有測試過任何類型的異常,但肯定是發生在SQLSTATE[40001]: Serialization failure
和主鍵違規。 這是預期的行爲還是PHP中的錯誤?
似乎知道回滾的唯一方法是保留一個單獨的變量,以知道我在交易中,使得inTransaction()
無用。我注意到一些開源框架(如Doctrine)和應用程序(如Drupal)保留其自己的變量以處理事務狀態。 爲什麼我們不能依靠驅動程序或數據庫來告訴我們交易是否正在進行?
PHP 5.5.32和PostgreSQL 9.4。發現了一個兩年前的相關bug report,該版本在較早版本的PHP中被關閉。
請參閱http://stackoverflow.com/questions/22743357/autorollback-in-postgres-using-pdo的答案......從它的外觀來看,「問題」就像PostgreSQL不是PHP和你看到的是正常的。 – Dave