SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
来源:互联网 发布:网易房产住宅成交数据 编辑:程序博客网 时间:2024/06/05 23:46
http://blog.csdn.net/tuzhen007/article/details/11183961
SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
问题:
1. System.Data.SqlClient.SqlException (0x80131904): EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
2. EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
后面的内容,是我之前写的东西,主要是一些测试代码,但是呢,我没有很深入的理解。现在直接说清楚本质的东西,把后面的精华再提上来说。
- 提交的事务不能撤销或回滚。
- 当不存在打开的事务时,@@trancount 等于 0。
- 执行 begin tran [tranName]语句将 @@trancount 增加 1。
- 执行commit tran [tranName]语句将 @@trancount 减小 1。
- 执行 rollback tran 会回滚整个事务并设置@@trancount 为 0。
- 执行 " rollback tran tranName"语句时有两种情况:
if(tranName 之前 是用 " Save Tran tranName" 建立的 ) @@trancount值不变
否则,@trancount 减小1
注意:save tran 命令,不会使@@trancount加1
分析:
只要提交或者回滚事务后,程序内部改变了事务参数@@TRANCOUNT,就会出上述的错误,无一例外。
试图直接用Sql " set @@trancount = 1;",这是sqlserver 不允许做的。
各位,出现上面的错误,最多的可能是在嵌套事务中。
如果不嵌套:没有begin tran前,@@trancount为0; begin tran后,@@trancount 此时为1;完事后就commit或rollback,@@trancount 此时为0;--不般我们是写不错的。
嵌套呢:
看看我之前写的一个存储过程:
.......
....做事去了
.......
有没有问题?(current_tran是保存点哈,不明白的,后面有比较详细的介绍)
我用了好久了(在一个项目里面),可是突然有一天,也就是今天,它出事了。原因嘛,虽然写的是嵌套的,之前都没有嵌套调到过。
我在外围开了一个事务,再来调这个存储过程,当它 commit tran current_tran 时(rollback tran current_tran是不会有事的),会出什么错误?如果你不能很明确的告诉我,说明你还没有理解得深刻。做个选择吧?
1."...BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。"
2."...BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
答案:【2】。
线索分析:我是在外部开了一个事务的,所以在未进入该存储过程以前@@trancount的值应该为1;进入时,save tran current_tran, @@trancount值没有变;完事的,执行commit tran current_tran,@@trancount的值应该为0;--所以,进入前,出来后,@@trancount值发生了改变,SqlServer不干了(原因,自己去想吧:拆散了begin tran 配对)。
怎么解决:
1.进入子事务前先记录@@trancount,我们用变量@trancount来记录。
2. 提交子事务前,先判断之前的@trancount是否为0;为0表示"该事务"前没有事务调用,可以直接提交事务;不为0,表明进入该事务前已经有一个事务,该事务是子事务,不能提交。
SqlServer 事务相关:《嵌套事务(一):.NET中嵌套事务运用的一点思考》
《嵌套事务(二):SqlServer中嵌套事务使用》
《SqlServer 嵌套事务机制 测试 》
- SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
- SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
- SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
- 嵌套事务(二):SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
- EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
- EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
- 消息 266,级别 16,状态 2,过程 UserExchange,第 0 行 EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
- EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句
- EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句
- yii如何使用事务,begin,commit,rollback
- yii如何使用事务,begin,commit,rollback
- C#中连接SqlServer数据库并且使用事务和using语句的实例
- spring 中 Hibernate 事务和JDBC事务嵌套问题
- SQL事务用法begin tran,commit tran和rollback tran的用法
- SQL 事务 begin tran、commit tran、rollback tran 的用法
- 嵌套事务的问题
- mybatis中commit和rollback使用不当造成事务泄露和锁超时问题总结
- SqlServer嵌套事务控制
- jdk动态代理
- 怎么查看被占用的文件进程
- 股价涨幅远超阿里腾讯,迅雷自创“玩客币”收割韭菜
- Eclipse、MyEclipse中的快捷键使用大全
- MogoDB和Redis应用场景的区别
- SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
- andriod——加入购物车
- 中标麒麟下安装OpenCV2.4.13
- 揭秘京东文件系统JFS的前世今生,支持双11每秒约10万个对象同时读写
- 灰度共生矩阵GLCM
- 数据库字段修改
- 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题
- Error:This Gradle plugin requires Studio 3.0 minimum
- OTC 玩客币怎么交易 交易平台推荐及教程