Zpracování chyb v transakcích

Dokončeno

Strukturované zpracování výjimek používá konstrukci TRY/CATCH k testování chyb a jejich zpracování. Při použití zpracování výjimek s transakcemi je důležité umístit klíčová slova COMMIT nebo ROLLBACK na správné místo ve vztahu k blokům TRY/CATCH.

Potvrdit transakce

Při použití transakcí se strukturovaným zpracováním výjimek umístěte COMMIT TRANSACTION do bloku TRY jako v následujícím příkladu kódu:

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 

Vrácení transakce zpět

Při použití se strukturovaným zpracováním výjimek umístěte ROLLBACK TRANSACTION do bloku CATCH jako v následujícím příkladu kódu:

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

Pokud se chcete vyhnout vrácení aktivní transakce zpět, použijte funkci XACT_STATE. XACT_STATE vrátí následující hodnoty:

Návratová hodnota Význam
1 Aktuální požadavek má aktivní, komitovatelnou uživatelskou transakci.
0 Žádná aktivní transakce.
-1 Aktuální požadavek má aktivní transakci uživatele, ale došlo k chybě, která způsobila, že transakce byla klasifikována jako nekommitovatelná transakce.

XACT_STATE lze použít před příkazem ROLLBACK a zkontrolovat, zda je transakce aktivní.

Následující kód ukazuje XACT_STATE funkci, která se používá v bloku CATCH, aby transakce byla vrácena zpět pouze v případě, že existuje aktivní transakce uživatele.

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;