解决 “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的匹配数

 

发布了121 篇原创文章 · 获赞 17 · 访问量 33万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览