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。 2年前に関連したbug reportがPHPの古いバージョンでは閉じられています。
答えはhttp://stackoverflow.com/questions/22743357/autorollback-in-postgres-using-pdo .....のようになります。見た目からは「問題」はそのままの状態でPostgreSQLはPHPではありません。あなたが見ているものは正常です。 – Dave