Il PDO inTransaction()
restituisce false mentre è ancora in una transazione se viene generata un'eccezione del database. Questo è probabilmente specifico per l'utilizzo di PostgreSQL. per esempio.PDO inTransaction() che restituisce false dopo l'eccezione del database
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;
}
L'operazione è sicuramente non è finita, perché se comincio un altro ricevo un'eccezione che c'è già una transazione in corso. Non ho testato ogni tipo di eccezione, ma sta sicuramente accadendo per SQLSTATE[40001]: Serialization failure
e violazioni delle chiavi primarie. Questo comportamento è previsto o è un bug in PHP?
Sembra che l'unico modo per conoscere il rollback sia mantenere una variabile separata per sapere che sono in una transazione, rendendo inutile inTransaction()
. Ho notato che alcuni framework open source (come Doctrine) e applicazioni (come Drupal) mantengono la propria variabile per lo stato della transazione. Perché non possiamo affidarci al driver o al database per dirci se è in corso una transazione?
PHP 5.5.32 e PostgreSQL 9.4. Ho trovato un vecchio anno correlato bug report che è stato chiuso in una versione precedente di PHP.
Vedere la risposta a http://stackoverflow.com/questions/22743357/autorollback-in-postgres-using-pdo ..... dagli sguardi di esso il "problema" era PostgreSQL non PHP e che quello che stai vedendo è normale. – Dave