我有一個存儲過程,看起來像:事務計數後執行錯誤
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
當這個代碼通過數據庫執行,一切都正常運行。當通過ADO.NET執行我得到以下錯誤信息:
「INSERT語句衝突與外鍵約束」 FK_table1_table2
」。該衝突發生於數據庫‘my_database
’,表‘dbo.table_1
’,列‘col_1
’ 。EXECUTE後的事務計數表示COMMIT或ROLLBACK TRANSACTION語句丟失。上一個計數= 1,當前計數= 0.「
這是因爲XACT_ABORT
設置迫使ADO.NET中的事務回滾?避免此錯誤的最佳方法是什麼?
因此,如果我正在做TRY/CATCH錯誤處理,更好的方法可能是不使用sprocs中的XACT_ABORT? – 2009-04-20 18:25:33