Gestionarea erorilor din tranzacții

Finalizat

Gestionarea excepțiilor structurate utilizează construirea TRY/CATCH pentru a testa erorile și a gestiona erorile. Atunci când utilizați o gestionare a excepțiilor cu tranzacțiile, este important să plasați cuvintele cheie COMITERE sau ROLLBACK în locul corect în relație cu blocurile TRY/CATCH.

Comiterea tranzacțiilor

Atunci când utilizați tranzacții cu manipulare structurată a excepțiilor, plasați TRANSACTION COMITE în interiorul blocului TRY, ca în următorul exemplu de cod:

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 

Tranzacție de revenire

Atunci când este utilizat cu gestionarea excepțiilor structurate, plasați TRANZACȚIa ROLLBACK în interiorul blocului CATCH ca în următorul exemplu de cod:

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

Pentru a evita revenirea la o tranzacție activă, utilizați funcția XACT_STATE. XACT_STATE returnează următoarele valori:

Valoare returnată Rost
1 Solicitarea curentă are o tranzacție de utilizator activă, comitabilă.
0 Nicio tranzacție activă.
-1 Solicitarea curentă are o tranzacție de utilizator activă, dar s-a produs o eroare care a determinat ca tranzacția să fie clasificată ca tranzacție incommitabilă.

XACT_STATE pot fi utilizate înainte de comanda ROLLBACK, pentru a verifica dacă tranzacția este activă.

Următorul cod arată funcția de XACT_STATE utilizată în blocul CATCH, astfel încât tranzacția să fie returnată doar dacă există o tranzacție de utilizator activă.

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;