Tranzakciók hibáinak kezelése
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;