TSQL:获取错误EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配

时间:2015-08-07 12:33:41

标签: sql-server

我有以下错误处理代码:

Create PROC myProc(--Parameters--) 
BEGIN
SET NOCOUNT ON

BEGIN TRAN
--My Code, combination of insertion and deletion

IF @@Error<>0
Goto ErrorSection

COMMIT TRAN
Return 0

ErrorSection:
    ROLLBACK TRAN
    raiserror(@error, 1, 2) with seterror
    return -1
END

每当我检查@@ Error&lt;&gt; 0的条件通过时,我的控件执行ErrorSection代码并且通过错误, &#34; EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0。&#34;

我很困惑,当控制到达ErrorSection时,我应该有一个活动事务立即回滚。那么为什么我会收到这个错误。

我还阅读了一些答案并使用&#34; SET XACT_ABORT ON&#34;保存我这个错误的属性。我也应该使用TRY-CATCH块。由于Rollback还将事务计数减少到零,所以当我的rollback语句成功执行时,为什么我会收到此错误。

我也注意到这个错误是在Return -1语句之上生成的,然后返回-1。

请建议为什么我在回滚成功运行时遇到此错误以及&#34; SET XACT_ABORT ON&#34;让我免于同样的事。

1 个答案:

答案 0 :(得分:0)

避免使用GOTO语句进行错误处理。相反,使用TRY ... CATCH来处理错误和回滚事务:

BEGIN TRANSACTION;

BEGIN TRY
    -- Code that might generate an error here
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

    -- Your custom code for error handling here
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

    -- Clean-up code here
GO