EXECUTE后的事务计数表示BEGIN和COMMIT语句的数目不匹配.犯错误的地方



下面是我的存储过程的外壳,其中没有省略必要的部分:

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

我得到一个死锁错误(这不是这篇文章的主题)在"——实际上做一些工作"部分,然后"事务计数…"错误被抛出。

我的COMMIT在错误的地方吗?

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

最新更新