SQL Server 2005 di recente intoduced il modo per eseguire il rollback delle transazioni in SQL Server 2005
SET XACT_ABORT ON
quando XACT_ABORT è su. Le istruzioni T-SQL automaticamente il rollback della transazione in caso di errore si è verificato nelle dichiarazioni.
SET XACT_ABORT ON
USO Emp
Inizia Tran
Inserire nella Valori EmpInfo(1)
Inserire nella Valori EmpInfo(1) — Questa istruzione verrà generato l'errore di chiave primaria
Inserire nella Valori EmpInfo(2)
Commit Tran
La prima riga di istruzione verrà eseguita senza errori. L'errore di chiave primaria aumenterà in seconda linea. Ma l'operazione intero blocco non sarà impegnata perché il XACT_ABORT in su.
È opportuno notare che XACT_ABORT termina la partita corrente * *, non l'intero comando. I lotti sono separati con la parola chiave GO. Esecuzione continuerà all'inizio della prossima partita.
Questa funzione è anche in SQL Server 2000, anche se si comporta in modo leggermente diverso per i vari errori.
In SQL 2000, ci sono casi in cui non riesce a XACT_ABORT rollback della transazione automaticamente.
Per esempio:
Inserimento in un nome di colonna non valido.
Inserimento in una chiave primaria con IDENTITY_INSERT OFF.
L'esecuzione di un SELECT che utilizza un inesistente UDF.
Questi tipi di errori sono di solito a causa di un comando poco autore, in modo che non si verificano nella gestione giorno per giorno del tuo programma, a meno che qualcuno altera lo schema. Ma io conto per la loro possibilità in sede di creazione di script di aggiornamento del database durante la distribuzione di una nuova versione di un progetto, solo in caso di distribuzione non va come previsto.
Ci sono modi per gestire questi errori. Il tuo COMMIT dovrebbe essere in batch esegue le istruzioni DML. Dopo che il lotto (dopo la parola chiave GO) è possibile controllare la TRANCOUNT @ @ per vedere se è maggiore di zero e agire di conseguenza. Di solito il rollback della transazione.
Le transazioni possono estendersi lotti, in modo da poter eseguire un rollback in un lotto successivo.