日期:2014-05-18  浏览次数:20529 次

EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句
SQL code

BEGIN TRANSACTION;
BEGIN TRY
    --代码太长省略  
END TRY
BEGIN CATCH
    SELECT  ERROR_MESSAGE() as ErrorMessage;
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
-----报错
消息 266,级别 16,状态 2,过程 sp_sys_flowlogic,第 187 行
EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。上一计数 = 0,当前计数 = 1。




有个脚本执行有错,提示在第 187 行,187行前后删除依然报错,还没找不到具体哪行问题。很奇怪为什么事物的提交或回滚并没有执行,导致锁了进程,难道写法有问题?。
这个过程使用率很高,报错这个时间段用户一直在执行,临时的解决办法写个监控kill掉锁死进程。 

各位大神,求更好的解决办法,这个错误为啥捕获不到呢?在线等


------解决方案--------------------
多半是因为全局的变量@@TRANCOUNT 被置为0

BEGIN TRANSACTION 语句将 @@TRANCOUNT 加 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减到 0,但 ROLLBACK TRANSACTION savepoint_name 除外,它不影响 @@TRANCOUNT。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1
------解决方案--------------------
错误信息如标题所示,从事务开始到结束,中间出现了错误或者其他导致事务没有执行完毕,所以提示缺少commit或rollback transaction。
当出现这个错误时着重检查事务内部的代码,导致此错误的可能原因:
1.可能在事务中间出现return语句导致存储过程跳出,没有继续往下执行..
2.可能在事务开始到结束这中间出现sql语句的错误,或者其他。比如写错表名,写错sql语句等。
------解决方案--------------------
没有对应上。