EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。在错误的地方犯错?

时间:2016-06-27 16:55:22

标签: sql sql-server tsql

这是我的存储过程的shell,其中没有省略必要的部分:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE procedure --name of sproc
    --declare sproc params
AS
BEGIN
  SET XACT_ABORT ON
    SET NOCOUNT ON
    BEGIN TRY
        BEGIN TRANSACTION

            --declare a few vars

      --declare some table variables

            --do some work
            IF (--some condition here)
      BEGIN
        --actually do the work
            END
            ELSE
            BEGIN
                ROLLBACK TRANSACTION
                SET @error = 'some value cannot be NULL'
                RAISERROR(@error, 16, 1)
                RETURN @error
            END
        COMMIT
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
        SELECT @error   = ERROR_NUMBER()
             , @message = ERROR_MESSAGE()
             , @severity = ERROR_SEVERITY()
             , @state = ERROR_STATE()

        RAISERROR(@message, @severity, @state)
        RETURN @error
    END CATCH
END
GO

我在“ - 实际做一些工作”部分中遇到死锁错误(这不是本文的主题),然后抛出“Transaction count ...”错误。

我的COMMIT在错误的位置吗?

1 个答案:

答案 0 :(得分:1)

Begin Transaction移到Begin Try上方。如果尝试失败并跳转到catch,则try中初始化的所有内容都超出了范围。在try / catch范围之外开始事务使得try和catch块都可用。