Czy zastanawiałeś się kiedyś, co się stanie, jeżeli wykonując ciąg instrukcji w ramach transakcji doprowadzisz do błędu? Czy transakcja się wykona opuszczając tę pojedynczą nieudaną instrukcję, czy też wycofa wszystkie operacje wykonywane w ramach transakcji? Reguluje to opcja XACT_ABORT.
Przyjrzyjmy się następującemu przykładowi:
CREATE DATABASE Test; GO USE Test; GO CREATE TABLE TestError ( id INT IDENTITY(1,1), nameVARCHAR(100) UNIQUE); GO
Teraz rozpoczniemy transakcję. W ramach tej transakcji, próbujemy dwa razy wstawic do tabeli rekord o takim samym name. Spowoduje to błąd – naruszenie unikalności tej kolumny!
BEGIN TRANSACTION INSERT INTO TestError VALUES ('jeden'); INSERT INTO TestError VALUES ('jeden'); INSERT INTO TestError VALUES ('dwa'); COMMIT TRANSACTION GO
Co znalazło się w tabeli TestError?
SELECT TRANSACTION * FROM TestError; GO
Cóż – mamy 2 rekordy. Czyli pierwszy i ostatni INSERT się udał.
Gdybyś chciał to zmienić możesz użyć opcji
SET XACT_ABORT ON
Powoduje ona, że kiedy podczas transakcji zostanie napotkany błąd, to transakcja zostanie wycofana w całości.
CREATE TABLE TestError2 ( id INT IDENTITY(1,1), nameVARCHAR(100) UNIQUE); GO
SET XACT_ABORT ON
BEGIN TRANSACTION INSERT INTO TestError2 VALUES ('jeden'); INSERT INTO TestError2 VALUES ('jeden'); INSERT INTO TestError2 VALUES ('dwa'); COMMIT TRANSACTION GO
Jeżeli teraz sprawdzimy zawartość tabeli:
SELECT TRANSACTION * FROM TestError2; GO
to okaże się, że jest ona pusta! Żaden rekord się nie zapisał, bo drugi INSERT wygenerował błąd, który wycofał transakcję.
Domyślnie opcja XACT_ABORT jest wyłączona.
Opcją XACT_ABORT możesz regulować „czułość” transakcji na błedy. Chcesz by transakcja była czuła i przy pierwszym błedzie spanikowała i wycofała się, przestaw opcję na ON. Chcesz by transakcja zapisała co może pomijając błedne dane – przestaw opcję na OFF.
Więcej o transakcjach na mobilo (mobilo24):
Dokładniej o tej opcji:
http://msdn.microsoft.com/en-us/library/ms188792.aspx