Tranzakciók hibáinak kezelése

Befejeződött

A strukturált kivételkezelés a TRY/CATCH szerkezettel teszteli a hibákat, és kezeli a hibákat. Ha kivételkezelést használ a tranzakciókkal, fontos, hogy a COMMIT vagy a ROLLBACK kulcsszavakat a megfelelő helyre helyezze a TRY/CATCH blokkokhoz képest.

Tranzakciók véglegesítése

Ha strukturált kivételkezeléssel rendelkező tranzakciókat használ, helyezze a COMMIT TRANSACTION-t a TRY blokkba, ahogyan az alábbi példakódban látható:

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 

Tranzakció visszavonása

Strukturált kivételkezelés esetén helyezze a ROLLBACK TRANSACTION-t a CATCH blokkba az alábbi kódpéldához hasonlóan:

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

Az aktív tranzakciók visszaállításának elkerülése érdekében használja a XACT_STATE függvényt. XACT_STATE a következő értékeket adja vissza:

Visszaadott érték Értelmezés
1 Az aktuális kérelem aktív, véglegesíthető felhasználói tranzakcióval rendelkezik.
0 Nincs aktív tranzakció.
-1 Az aktuális kérelem aktív felhasználói tranzakcióval rendelkezik, de hiba történt, amely miatt a tranzakció nem véglegesíthető tranzakcióként lett besorolva.

XACT_STATE használható a ROLLBACK parancs előtt annak ellenőrzésére, hogy a tranzakció aktív-e.

Az alábbi kód a CATCH blokkban használt XACT_STATE függvényt mutatja be, hogy a tranzakció csak aktív felhasználói tranzakció esetén legyen visszaállítva.

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;