Håndter fejl i transaktioner

Fuldført

Struktureret undtagelseshåndtering bruger TRY/CATCH-konstruktionen til at teste for fejl og håndtere fejl. Når du bruger håndtering af undtagelser i forbindelse med transaktioner, er det vigtigt at placere nøgleordene COMMIT eller ROLLBACK på det korrekte sted i forhold til TRY/CATCH-blokkene.

Bekræft transaktioner

Når du bruger transaktioner med struktureret undtagelseshåndtering, skal du placere COMMIT TRANSACTION 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 

Annulleringstransaktion

Når funktionen bruges med struktureret undtagelseshåndtering, skal du placere ROLLBACK TRANSACTION 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 undgå at annullere en aktiv transaktion, skal du bruge funktionen XACT_STATE. XACT_STATE returnerer følgende værdier:

Returværdi Betydning
1 Den aktuelle anmodning har en aktiv brugertransaktion, der kan bekræftes.
0 Ingen aktiv transaktion.
-1 Den aktuelle anmodning har en aktiv brugertransaktion, men der er opstået en fejl, der har medført, at transaktionen er klassificeret som en transaktion, der ikke kan godkendes.

XACT_STATE kan bruges før kommandoen ROLLBACK til at kontrollere, om transaktionen er aktiv.

Følgende kode viser den XACT_STATE funktion, der bruges i CATCH-blokken, så transaktionen kun annulleres, hvis der er en aktiv brugertransaktion.

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;