2013-04-04 10 views
7

Questo dovrebbe essere facile per chi ha familiarità con PostgreSQL:rollback dopo l'errore nella transazione

La mia applicazione emette un begin_work, fa una serie di operazioni, e poi emette un commit. Le operazioni e il commit sono racchiusi all'interno di un blocco try-catch, la cui dichiarazione catch effettua un rollback. Presupposto: se si verifica un errore durante un'operazione SQL, Postgresql eseguirà automaticamente il rollback della transazione, pertanto il mio rollback sarà ridondante ma innocuo. Questa supposizione è corretta?

(Il motivo per cui sto Tornare indietro in ogni caso:. Nel caso in cui un'eccezione non correlata a un'operazione SQL ocurs)

risposta

4

Se si verifica un errore, PostgreSQL non in realtà rollback della transazione. Fallisce ogni dichiarazione successiva con un errore. Puoi provarlo nel client.

È necessario eseguire il rollback prima che qualsiasi istruzione possa essere eseguita correttamente.

Nel caso in cui si chiuda la connessione e ne inizi una nuova, ciò è di scarsa importanza. Tuttavia, se mantieni la connessione ed esegui altre istruzioni che prevedi di eseguire correttamente, non funzionerà.

+0

Quindi, sembra che la mia ipotesi fosse sbagliata, ma avevo comunque ragione di fare un rollback. Grazie! –

+2

@JonSmark corretto. Pg contrassegna la transazione come interrotta, ma non ritorna alla modalità di autocommit o apre una nuova transazione fino all'emissione di un rollback. La ragione è che altrimenti si possono avere situazioni sgradevoli come "INSERT INTO historytable SELECT * FROM maintable", non riuscendo poi a seguire la seguente "maintable TRUNCATE TABLE". Ahia! –

Problemi correlati