2012-08-23 7 views
9

Sto usando la libreria mysqli di PHP. Inserimenti e aggiornamenti del database sono sempre in un blocco try-catch. Il successo di ogni query viene immediatamente verificato (if $result === false) e qualsiasi errore genera un'eccezione. Il catch chiama mysqli_rollback() ed esce con un messaggio per l'utente.Con PHP e MySQL, dovresti controllare i fallimenti di rollback?

La mia domanda è, dovrei preoccuparmi di controllare il valore di ritorno di mysqli_rollback()? In tal caso, e il rollback fallisce, quali azioni dovrebbe intraprendere il codice?

Ho difficoltà a capire come un rollback potrebbe fallire (salvo qualche bug atroce in MySQL). E poiché PHP sta per uscire comunque, chiamare il rollback sembra quasi superfluo. Penso certamente che dovrebbe essere nel codice per chiarezza, ma quando PHP uscirà chiuderà la connessione a MySQL e le transazioni non vincolate verranno automaticamente ripristinate.

+2

Se stai cercando un esempio concreto con probabilità realistica- Il tuo php può essere eseguito su una macchina diversa da quella su cui è eseguito il database (ad esempio, server di database separato). La rete io ha un sacco di scenari "funziona ora ma non funziona il secondo successivo". Naturalmente potrebbe accadere con entrambi sulla stessa macchina, solo molto meno probabile. – goat

+0

Interessante! Sembra che le implicazioni siano le stesse in questo scenario: anche se la chiamata di rollback fallisce, la sessione client MySQL di PHP terminerà e il rollback avverrà. Quindi forse vale la pena registrare l'errore come indicatore di problemi più grandi, ma non devi preoccuparti dell'integrità dei dati. – giskard22

risposta

4

se il rollback non riesce (errore di connessione, ad esempio), le modifiche verranno ripristinate dopo la chiusura della connessione in ogni caso, quindi non è necessario gestire l'errore. Quando si è in transazione, a meno che non si abbia un commit esplicito (o si stia eseguendo in modalità di autocommit, il che significa che è stato eseguito il commit dopo ogni istruzione), la transazione viene ripristinata.

Se una sessione con disabilitazione guidata automatica termina senza esplicitamente impegnando la transazione finale, MySQL esegue il rollback della transazione.

L'unico caso in cui si desidera gestire l'errore di rollback è se non si sta uscendo dallo script, ma se si avvia una nuova transazione in un secondo momento, poiché la transazione iniziale implicherà implicitamente quella corrente. Partenza Statements That Cause an Implicit Commit

+0

Questo è quello che ho capito. Non ero a conoscenza di dichiarazioni che causano commit implicito, quindi grazie! A proposito, un link migliore per questa informazione è probabilmente [Dichiarazioni che causano un Implicito Impegno] (http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html) – giskard22

0

mysqli_rollback può non riuscire se non si è (mai stati) connessi al database. Dipende dalla tua gestione degli errori prima mano.