2009-04-20 32 views
0

我有一個存儲過程,看起來像:事務計數後執行錯誤


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中的事務回滾?避免此錯誤的最佳方法是什麼?

回答

2

,你可以在你的代碼檢查XACT_STATE(),然後提交或回滾,看看這裏:Use XACT_STATE() To Check For Doomed Transactions

基本上像這樣將炸燬

BEGIN TRANSACTION TranA 
    BEGIN TRY 
    DECLARE @cond INT; 
    SET @cond = 'A'; 
    END TRY 
    BEGIN CATCH 
    PRINT 'a' 
    END CATCH; 
    COMMIT TRAN TranA 

,並在您檢查XACT_STATE你可以控制它

BEGIN TRANSACTION TranA 
    BEGIN TRY 
    DECLARE @cond INT; 
    SET @cond = 'A'; 
    END TRY 
    BEGIN CATCH 
    PRINT ERROR_MESSAGE(); 
    END CATCH; 
    IF XACT_STATE() =0 
    BEGIN 
    COMMIT TRAN TranA 
    END 
    ELSE 
    BEGIN 
    ROLLBACK TRAN TranA 
    END 

也來看看這兩個必須閱讀鏈接 Implementing Error Handling with Stored ProceduresError Handling in SQL Server – a Background

+0

因此,如果我正在做TRY/CATCH錯誤處理,更好的方法可能是不使用sprocs中的XACT_ABORT? – 2009-04-20 18:25:33

2

IF XACT_STATE()= 0 BEGIN COMMIT TRAN TranA END

將生成ERRO。 XACT_STATE()= 0意味着沒有事務提交或回滾

XACT_STATE()= 1意味着存在commitable交易

XACT_STATE()= - 1指有將由數據庫引擎rollbacked uncommitable交易在當前情況下結束。

相關問題