2017-10-17 37 views
0

我在存储过程中出现此错误。回滚完成 - 但这个错误:EXECUTE后的事务计数表示不匹配的BEGIN和COMMIT语句数

EXECUTE后的事务计数表示BEGIN和COMMIT语句不匹配的数量。以前的计数= 1,当前计数= 0.

我通读了一些答案,发现如果没有提交就返回,我得到错误。我的存储过程是这样的:

BEGIN TRY 
BEGIN 
    if @id is null 
     BEGIN 
     set @id= (SELECT last_sequence_value FROM table_name WHERE sequence_name = 'id') + 1 
      BEGIN    
       BEGIN TRANSACTION 

        -- update SQL statement here 

        IF @@ROWCOUNT = 0 
        BEGIN      
         ROLLBACK TRANSACTION 
         RAISERROR('There was an error getting unique id in the table.',10,1)      
         RETURN 
        END 
        IF (@@ERROR <> 0) 
        BEGIN 
         ROLLBACK TRANSACTION 
         RAISERROR('There was an error updating record to the table',10,1) 
         RETURN 
        END 
       COMMIT TRANSACTION 
      END 
     END 
    else 
     BEGIN 
      -- some sql select statements 
     END 
    END 
END TRY 
BEGIN CATCH 
    -- Raise an error with the details of the exception 
     RAISERROR(@ErrMsg, @ErrSeverity, 1) WITH SETERROR 
END CATCH 

从上面的代码,我做了回滚,并从存储过程返回。然而,当我在perf测试环境中运行这个时,我得到了前面提到的错误。

对此有帮助。

+0

你想要以上? –

+0

是的 - 嵌套事务时不应该使用回滚事务 - 这会将最外层的事务回滚回来,因此有关@@ trancount的错误将保留为0.您可能需要使用Save Points [here](https://stackoverflow.com/ a/28038615/314291)和[这里](https://stackoverflow.com/a/9744581/314291) – StuartLC

+0

@StuartLC - 是的,你是对的,但因为我已经回滚了交易并提到了return语句,所以没有办法它应该进入提交事务。所以我仍然不确定为什么会出现这个错误。如果我在没有回滚的情况下进行了回报,那么风险很大,因为它会保持交易的开放。 – GuruC

回答

0

我已经在catch块添加

IF @@TRANCOUNT > 0 
    ROLLBACK TRANSACTION 

之前我引发错误固定它。

感谢大家的精彩投入。

-1

在这里你应该使用try catch博客里面的开始交易。这样

BEGIN 
    if @id is null 
     BEGIN 
     set @id= (SELECT last_sequence_value FROM table_name WHERE sequence_name = 'id') + 1 
      BEGIN    
       BEGIN TRANSACTION 
        BEGIN TRY 
        -- update SQL statement here 

        IF @@ROWCOUNT = 0 
        BEGIN      
         ROLLBACK TRANSACTION 
         RAISERROR('There was an error getting unique id in the table.',10,1)      
         RETURN 
        END 
        IF (@@ERROR <> 0) 
        BEGIN 
         ROLLBACK TRANSACTION 
         RAISERROR('There was an error updating record to the table',10,1) 
         RETURN 
        END 

        END TRY 
        BEGIN CATCH 
         -- Raise an error with the details of the exception 
         RAISERROR(@ErrMsg, @ErrSeverity, 1) WITH SETERROR 
        END CATCH 
       COMMIT TRANSACTION 
      END 
     END 
    else 
     BEGIN 
      -- some sql select statements 
     END 
    END 
+0

我在内部或外部使用try catch有什么关系?你能解释一下吗?我想确保COMMIT TRANSACTION不会在return语句后发生 – GuruC

-1

首先,比较

DECLARE @ErrorVar INT 

RAISERROR(N'Message', 16, 1); 
IF @@ROWCOUNT <> 0 
    PRINT 'Rows <> 0' 
IF @@ERROR <> 0 
    PRINT N'Error = ' + CAST(@@ERROR AS NVARCHAR(8)); 
GO 

DECLARE @ErrorVar INT, 
    @Error INT, 
    @Cnt INT 

RAISERROR(N'Message', 16, 1); 
SELECT @ERROR = @@ERROR, @Cnt = @@ROWCOUNT 
IF @Cnt <> 0 
    PRINT 'Rows 0' 
IF @ERROR <> 0 
    PRINT N'Error = ' + CAST(@@ERROR AS NVARCHAR(8)); 
GO 

https://docs.microsoft.com/en-us/sql/t-sql/functions/error-transact-sql 因为@@ ERROR被清除,并且在执行每个语句复位,检查紧随声明是验证,或将其保存到可以稍后检查的局部变量。 +

相关问题