を実行します。このコードは、データベースを介して実行された場合トランザクション数は後に、私は何かのように見えますストアドプロシージャ持っエラー
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
を、すべてが正常に動作します。 『テーブル『dbo.table_1
』、列『col_1
』を
FK_table1_table2
「FOREIGN KEY制約と競合INSERT文は」my_database
」競合がデータベースで発生しました。』:ADO.NETを通じて実行すると私は戻って、次のエラーメッセージが表示されます以前のカウント= 1、現在のカウント= 0 "
の設定により、ADO.NETからのトランザクションを強制的にロールバックするため、この問題が発生しているかどうかを確認します。 ?このエラーを避ける最善の方法は何ですか?
TRY/CATCHエラー処理を実行している場合、より良いアプローチはsprocsでXACT_ABORTを使用しないことでしょうか? –
XACT_ABORTは、残っているジャンクを解消し、分散トランザクションを実行するときにも必要となるため、常に使用することをお薦めします。読んでいただけるように2つのリンクを追加します – SQLMenace