J'ai une procédure stockée qui ressemble à quelque chose comme:Nombre de transactions après EXECUTE erreur
CREATE PROCEDURE my_procedure
@val_1 INT,
@val_2 INT
AS
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO table_1(col_1, col_2)
VALUES (@val_1, @val_2);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE
@ERROR_SEVERITY INT,
@ERROR_STATE INT,
@ERROR_NUMBER INT,
@ERROR_LINE INT,
@ERROR_MESSAGE NVARCHAR(4000);
SELECT
@ERROR_SEVERITY = ERROR_SEVERITY(),
@ERROR_STATE = ERROR_STATE(),
@ERROR_NUMBER = ERROR_NUMBER(),
@ERROR_LINE = ERROR_LINE(),
@ERROR_MESSAGE = ERROR_MESSAGE();
RAISERROR('Msg %d,
Line %d,
:%s',
@ERROR_SEVERITY,
@ERROR_STATE,
@ERROR_NUMBER,
@ERROR_LINE,
@ERROR_MESSAGE);
END CATCH
Lorsque ce code est exécuté par la base de données, tout fonctionne correctement. Quand exécuter par ADO.NET je rentrerai le message d'erreur suivant:
« L'instruction INSERT en conflit avec la contrainte FOREIGN KEY » FK_table1_table2
». Le conflit a eu lieu dans la base de données « my_database
», table « dbo.table_1
», colonne « col_1
» . nombre de transactions après EXECUTE indique qu'une instruction COMMIT ou ROLLBACK tRANSACTION est manquante. nombre précédent = 1, nombre actuel = 0 "
est-ce qui se passe car le paramètre XACT_ABORT
oblige une transaction de ADO.NET à être annulées ? Quel est le meilleur moyen d'éviter cette erreur?
Donc une meilleure approche pourrait être de ne pas utiliser XACT_ABORT dans les sprocs si je fais la gestion des erreurs TRY/CATCH? –
XACT_ABORT est toujours bon à utiliser car il va effacer toute ordure restante et est également nécessaire lorsque vous faites une transaction distribuée, je vais ajouter 2 liens à ma réponse pour vous de lire – SQLMenace