Gérer les erreurs dans les transactions

Terminée

La gestion structurée des exceptions utilise la construction TRY/CATCH pour tester les erreurs et gérer les erreurs. Lors de l’utilisation de la gestion des exceptions avec des transactions, il est important de placer les mots clés ou ROLLBACK les COMMIT mots clés au bon endroit par rapport aux blocs TRY/CATCH.

Valider les transactions

Lorsque vous utilisez des transactions avec gestion des exceptions structurées, placez le COMMIT TRANSACTION bloc TRY comme dans l’exemple de code suivant :

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 

Annuler la transaction

Lorsqu’elle est utilisée avec la gestion des exceptions structurées, placez le ROLLBACK TRANSACTION bloc CATCH comme dans l’exemple de code suivant :

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

Pour éviter de restaurer une transaction active, utilisez la XACT_STATE fonction. XACT_STATE retourne les valeurs suivantes :

Valeur retournée Signification
1 La session active a une transaction utilisateur active. La session peut effectuer toutes les actions, notamment l’écriture de données et la validation de la transaction.
0 Aucune transaction active.
-1 La session active a une transaction utilisateur active, mais une erreur s’est produite qui a classé la transaction comme non modifiable. La session ne peut pas valider ou restaurer un point d’enregistrement ; il ne peut effectuer que des lectures et doit émettre un fichier complet ROLLBACK TRANSACTION.

XACT_STATE peut être utilisé avant la ROLLBACK commande pour vérifier si la transaction est active.

Le code suivant montre la XACT_STATE fonction utilisée à l’intérieur d’un bloc CATCH. Il distingue l’état -1 (noncommittable) doit être entièrement rétabli par l’état 1 (commitable) :

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;

	-- Test for uncommittable transaction (for example, caused by SET XACT_ABORT ON).
	IF XACT_STATE() = -1
	BEGIN
		ROLLBACK TRANSACTION;
	END;

	-- Test for active, committable transaction.
	IF XACT_STATE() = 1
	BEGIN
		COMMIT TRANSACTION;
	END;
	-- If XACT_STATE() = 0, there is no active transaction; no action needed.
END CATCH;