热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TransactioncountafterEXECUTEindicatesamismatchingnumberofBEGINandCOMMITstatements

TransactioncountafterEXECUTEindicatesamismatchingnumberofBEGINandCOMMITstatements

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

出现了这个错之后就去查了下需要插入的表,发现锁表了,所以猜测是不是刚刚运行的过程的事务没有回滚(或提交)。就关闭当前查询窗口,出现如下信息证实了猜测:
enter description here
但是过程中的TRY CATCH语句块中已经写有ROLLBACK了。此时,不得不怀疑是不是自己写的TRY CATCH有问题,首先在过程中添加SELECT 1/0,对于这一错误ROLLBACK是起作用的。后来就去MSDN看TRY CATCH帮助文档,发现有这么一段说明:
enter description here
这个完全符合我遇到的情况,所以原来就是引用表的数据库名写错,造成致命性错误,使得CATCH捕捉不到异常,所以事务没能ROLLBACK

演示

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

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 

 

enter description here

1460734370861.jpg

 

 

enter description here

1460736223442.jpg

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

 

 

enter description here

1460734736433.jpg

 

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

--查询T1
SELECT * FROM T1;

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

 

enter description here

1460734465672.jpg

 

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

T2没有创建:

 

enter description here

1460734518647.jpg

 

解决方案

首先使用KILL命令将查询1的连接给断开,然后在test_sp中设置XACT_ABORTON。如果XACT_ABORTON时,如果执行 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;

 

enter description here

1460735835769.jpg

 

 

enter description here

1460736150990.jpg

 

 

enter description here

1460736007326.jpg

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

 

我们在AdventureWorks2012数据库中创建t2

CREATE TABLE t2 (col1 int) 

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

EXEC test_sp 

 

enter description here

1460736881949.jpg

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

 

SELECT @@TRANCOUNT AS Trancount 

 

enter description here

1460736950117.jpg

 

结论

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

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

参考:
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/


返回顶部

推荐阅读
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER ... [详细]
  • 本文讨论了在 Oracle 10gR2 和 Solaris 10 64-bit 环境下,从 XMLType 列中提取数据并插入到 VARCHAR2 列时遇到的性能问题,并提供了优化建议。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 周排行与月排行榜开发总结
    本文详细介绍了如何在PHP中实现周排行和月排行榜的开发,包括数据库设计、数据记录和查询方法。涉及的知识点包括MySQL的GROUP BY、WEEK和MONTH函数。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 本文介绍了Go语言中正则表达式的基本使用方法,并提供了一些实用的示例代码。 ... [详细]
author-avatar
mobiledu2502874483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有