Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements

开始想写一个过程,根据一个项目的数据库的一个表的导数据到另一个数据库中去,本来在本地测试时蛮好的,但是将过程升级到生产服务器之后运行之后,根据下面类似的错误信息发现是生产服务器上引用的数据库名不对。

Msg 208, Level 16, State 1, Procedure test_sp, Line 10
Invalid object name 'test.dbo.col1'.
Msg 266, Level 16, State 2, Procedure test_sp, Line 10
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1

出现了这个错之后就去查了下需要插入的表,发现锁表了,所以猜测是不是刚刚运行的过程的事务没有回滚(或提交)。就关闭当前查询窗口,出现如下信息证实了猜测:

但是过程中的TRY CATCH语句块中已经写有ROLLBACK了。此时,不得不怀疑是不是自己写的TRY CATCH有问题,首先在过程中添加SELECT 1/0,对于这一错误ROLLBACK是起作用的。后来就去MSDNTRY CATCH帮助文档,发现有这么一段说明:

这个完全符合我遇到的情况,所以原来就是引用表的数据库名写错,造成致命性错误,使得CATCH捕捉不到异常,所以事务没能ROLLBACK

演示

我就改写我的过程来演示遇到的问题和解决这个问题的方案。T1表中只有3条数据

CREATE PROCEDURE [dbo].[test_sp] AS
BEGIN TRY
BEGIN TRAN
SET NOCOUNT ON;
INSERT INTO T1( col1, col2 )VALUES( 3,3); SELECT * FROM T1; SELECT * FROM [AdventureWorks2012].[dbo].[T2] COMMIT TRAN;
END TRY
BEGIN CATCH ROLLBACK TRAN; THROW;
END CATCH

查询1窗口执行test_sp过程

EXEC test_sp

--连接上执行的 BEGIN TRANSACTION 语句的数目
SELECT @@TRANCOUNT AS Trancount
1460734370861.jpg
1460736223442.jpg

如果想关闭当前查询1窗口,弹出信息:

1460734736433.jpg

查询2窗口查询T1[AdventureWorks2012].[dbo].[T2]

--查询T1
SELECT * FROM T1;

T1一直被查询1的事务占用:

1460734465672.jpg
--查询T2
SELECT * FROM [AdventureWorks2012].[dbo].[T2]

T2没有创建:

1460734518647.jpg

解决方案

首先使用KILL命令将查询1的连接给断开,然后在test_sp中设置XACT_ABORT为ON。如果XACT_ABORT为ON时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚;为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。 如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 OFF 是默认设置。

SET XACT_ABORT ON;

我们在查询1窗口中重新运行,顺带尝试关闭窗口:

EXEC test_sp

SELECT @@TRANCOUNT AS Trancount 

--查询T1
SELECT * FROM T1;
1460735835769.jpg
1460736150990.jpg
1460736007326.jpg

@@TRANCOUNT为0,T1表还是只有3条纪录,说明事务顺利的终止并且回滚了。

我们在AdventureWorks2012数据库中创建t2

CREATE TABLE t2 (col1 int)

查询1中先运行一遍将第4条数据插入,再运行第二遍。

EXEC test_sp
1460736881949.jpg

由于主键约束,抛出异常,我们可以检查当前连接的事务连接数也是0:

SELECT @@TRANCOUNT AS Trancount
1460736950117.jpg

结论

设置XACT_ABORT为ON时,即使过程中没有TRY CATCH,如果语句导致任何异常才会发生回滚。所以我们要灵活使用XACT_ABORT,如果使用TRY CATCH能够捕捉所有需要解决的错误时,我们就不必开启XACT_ABORT,只有错误比较严重时才考虑XACT_ABORT为ON。

所以,我应该滚回去修改引用的数据库名就好了。

参考:
http://www.cnblogs.com/chenxizhang/archive/2008/07/29/1255737.html
https://technet.microsoft.com/zh-cn/library/ms164086.aspx
https://msdn.microsoft.com/zh-cn/library/ms188792(v=sql.120).aspx
https://www.mssqltips.com/sqlservertip/4018/sql-server-transaction-count-after-execute-indicates-a-mismatching-number-of-begin-and-commit-statements/


返回顶部

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements的更多相关文章

  1. EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配

    EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 问题原因: 两个表A\B之间存在外键关系,当插入表A的时候,A的外键B在B表中不存在可以引起这个问题: ...

  2. EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配

    代码中的事务包含了存储过程中的事务.

  3. System.Data.SqlClient.SqlException (0x80131904): EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。 EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。

    EF使用ExecuteSqlCommand(db.Database.ExecuteSqlCommand("exec proc_DeleteCaseInfo_Output @caseID&qu ...

  4. EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。上一计数 = 1,当前计数 = 2

    理解这一句话: 一个begin tran会增加一个事务计数器,要有相同数量的commit与之对应,而rollback可以回滚全部计数器 这个错误一般是出现在嵌套事务中. 测试环境 sql 2008 例 ...

  5. Nested transactions in stored procedure of SQLServer

    question: if the nested transaction encountered an exception, then rollbacked. How about the outer t ...

  6. Sqlserver的Transaction做Rollback的时候要小心(转载)

    仔细研究了下,发现sql server里面的explicit transaction(显示事务)还是有点复杂的.以下是有些总结: Commit transaction 会提交所有嵌套的transact ...

  7. [转]sql server transaction

    本文转自: http://www.2cto.com/database/201208/146734.html sql事务(Transaction)用法介绍及回滚实例   事务(Transaction)是 ...

  8. SQL Server 全局变量

    SQL Server中所有全局变量都使用两个@符号作为前缀 --1.@@error 最后一个T-SQL错误的错误号(目的是或得违反约束的错误号) insert into Subject values( ...

  9. SQL Server 中的嵌套事务与@@TranCount(转)

    在处理事务的时候,一般都用RollBack Transaction来回滚,但是如果在嵌套事务中这样使用的话,就会出现错误. 在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映 ...

随机推荐

  1. HDU_2212_水

    DFS Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. android Adapter总结

    1.连接视图与数据.数据封装: 2.视图构造与配置: 3.数据更新监听: 4.视图重用机制. * An Adapter object acts as a bridge between an {@lin ...

  3. eclipse的任务列表

    如上图所示,备注加  TODO  ,可以在tasks列表中显示,提示你还有哪些工作需要完善 昨天遇到一个问题,加了  TODO  任务列表里却不显示,后来发现是因为任务列表只显示了前100条,而我的项 ...

  4. CDR真实图片转水墨画效果制作教程

    CorelDRAW创造性滤镜组是最具有创造力的滤镜,使用里面的散开滤镜能够实现类似于水墨的表现手法,然后再结合图层的合并模式,让您的图片产生意想不到的视觉效果.本文将利用CorelDRAW软件中提供的 ...

  5. 10.3 io流 正篇 FileReader FileWriter读写代码

    一.FileWriter 小节: 1)FileWriter fw = new FileWriter("a.txt",true);//表示追加写入,默认是false.正常情况:执行多 ...

  6. Lua练习题集嚢

    --1.table.sort() am = {"cc","nn","ll","dd"} arr = function ( ...

  7. Django工程

    一.Django工程创建 1.Django安装: pip3 install django 安装成功后,会在python的安装目录下“Scripts"中生成”django-admin.exe& ...

  8. 标准C 语言总结

    ***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...

  9. 利用open MP获取计算机核心数量的方法

    openMP是一款普遍通用的并行计算编程模型,使用它通常能够充分利用多核计算的优势. 以下是一种能够测试核心数量的方法: std::cout << "parallel begin ...

  10. Python3 编写登陆接口

    题目选自 Alex Python自动化开发之路的题目,我是从C++转学Python的,编写的水平有限,轻喷. 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 首先应该有2个txt文件,包含用户 ...