解决 “EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 ”

错误提示:

EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。

错误原因:

BEGIN 看成计数开始点

COMMIT 和R OLLBACK  看成计数结束点 

每个计数 开始点 和 结束点 要成对匹配

情况分析

1. BEGIN 和 COMMIT 中间有RETURN的存在 , 后面的COMMIT(ROLLBACK)不会被执行,所以数目不匹配

Select @rval = 0
BEGIN TRANSACTION

    Insert Into USERS(name , age) VALUES( @name , @age)
    if @@error <> 0
    BEGIN
        Select @rval = -1
        return -- 错误示例:这里返回后,下面的代码不会被执行,最后的COMMIT会引起不匹配
    END

    Insert Into company(address , tel) values(@address , @tel)
    if @@error <> 0
    BEGIN
        Select @rval = -2
        return -- 错误示例:这里返回后,下面的代码不会被执行,最后的COMMIT会引起不匹配
    END
COMMIT TRANSACTION

 

2.COMMIT前有ROLLBACK , 执行了ROLLBACK 后不使用RETURN,继续执行后面代码中如果有COMMIT数目也不匹配。

Select @rval = 0
BEGIN TRANSACTION

    Insert Into USERS(name , age) VALUES( @name , @age)
    if @@error <> 0
    BEGIN
        Select @rval = -1       
    END

    Insert Into company(address , tel) values(@address , @tel)
    if @@error <> 0
    BEGIN
        Select @rval = -2
        ROLLBACK TRANSACTION
        return -- 因为上面一行代码使用了ROLLBACK,已经结束了和前面BEGIN的匹配,所以继续执行下去的COMMIT会造成不匹配,所以这里必须使用return 不执行最后的COMMIT
    END
COMMIT TRANSACTION

 

解决方法:

1. 只有 BEGIN 与 COMMIT , 中间没有ROLLBACK,那么BEGIN和COMMIT之间不能用 RETURN

2. 如果使用了ROLLBACK回滚事务,要检查BEGIN的匹配数

猜你喜欢

转载自blog.csdn.net/gtosky4u/article/details/103983171