N'ouvrez une transaction qu'une fois que vous êtes dans le TRY
block et juste avant l'instruction proprement dite, et validez-la immédiatement. N'attendez pas que votre commande aille en fin de lot pour valider vos transactions.
Si quelque chose ne va pas pendant que vous êtes dans le TRY
bloc et que vous avez ouvert une transaction, le contrôle passera au CATCH
bloc. Il vous suffit d'annuler votre transaction et de gérer les autres erreurs si nécessaire.
J'ai ajouté un petit chèque pour toute transaction ouverte en utilisant @@TRANCOUNT
fonction avant de réellement annuler la transaction. Cela n'a pas vraiment de sens dans ce scénario. Il est plus utile lorsque vous effectuez des vérifications de validation dans votre TRY
bloquer avant d'ouvrir une transaction comme vérifier les valeurs des paramètres et d'autres éléments et générer une erreur dans le TRY
bloquer si l'un des contrôles de validation échoue. Dans ce cas, le contrôle sautera au CATCH
bloquer sans même ouvrir une transaction. Là, vous pouvez vérifier toute transaction ouverte et annuler s'il y en a. Dans votre cas, vous n'avez vraiment pas besoin de vérifier les transactions ouvertes car vous n'entrerez pas le CATCH
bloquer sauf si quelque chose ne va pas dans votre transaction.
Ne demandez pas après avoir exécuté le DELETE
opération si elle doit être validée ou annulée ; faites toutes ces validations avant d'ouvrir la transaction. Une fois qu'une transaction est ouverte, validez-la immédiatement et en cas d'erreur, gérez les erreurs (vous faites du bon travail en obtenant des informations détaillées en utilisant presque toutes les fonctions d'erreur).
BEGIN TRY
BEGIN TRANSACTION SCHEDULEDELETE
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
COMMIT TRANSACTION SCHEDULEDELETE
PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed'
END
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
END CATCH