Håndtere feil i transaksjoner

Fullført

Strukturert unntakshåndtering bruker TRY/CATCH-konstruksjonen til å teste for feil og håndtere feil. Når du bruker unntaksbehandling med transaksjoner, er det viktig å plassere nøkkelordene COMMIT eller ROLLBACK på riktig sted i forhold til TRY/CATCH-blokkene.

Utfør transaksjoner

Når du bruker transaksjoner med strukturert unntaksbehandling, plasserer du COMMIT-TRANSAKSJONEN i TRY-blokken som i følgende kodeeksempel:

BEGIN TRY
 BEGIN TRANSACTION
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION
END TRY 

Tilbakerullingstransaksjon

Når den brukes med strukturert unntaksbehandling, plasserer du TILBAKERULLING-TRANSAKSJONEN i CATCH-blokken som i følgende kodeeksempel:

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	ROLLBACK TRANSACTION;
END CATCH;

XACT_STATE

Hvis du vil unngå å rulle tilbake en aktiv transaksjon, bruker du XACT_STATE-funksjonen. XACT_STATE returnerer følgende verdier:

Returverdi Betydning
1 Gjeldende forespørsel har en aktiv, forpliktende brukertransaksjon.
0 Ingen aktiv transaksjon.
-1 Gjeldende forespørsel har en aktiv brukertransaksjon, men det har oppstått en feil som har ført til at transaksjonen klassifiseres som en uforpliktende transaksjon.

XACT_STATE kan brukes før ROLLBACK-kommandoen for å kontrollere om transaksjonen er aktiv.

Følgende kode viser XACT_STATE-funksjonen som brukes i CATCH-blokken, slik at transaksjonen bare rulles tilbake hvis det er en aktiv brukertransaksjon.

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.SimpleOrders(custid, empid, orderdate) 
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.SimpleOrderDetails(orderid,productid,unitprice,qty) 
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	IF (XACT_STATE()) <> 0
    	BEGIN
        ROLLBACK TRANSACTION;
    	END;
	ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;