SQL SERVER中@@TRANCOUNT
类别:数据库 浏览量:1991
时间:2015-8-14 SQL SERVER中@@TRANCOUNT
SQL SERVER中@@TRANCOUNT一、SQL SERVER中@@TRANCOUNT的理解
在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。
每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。
例如
BEGIN TRAN --@@TRANCOUNT值为0
SELECT @@TRANCOUNT --值为1
BEGIN TRAN
SELECT @@TRANCOUNT --值为2
COMMIT TRAN
SELECT @@TRANCOUNT --值为1
ROLLBACK TRAN
SELECT @@TRANCOUNT --值为0
--又如
BEGIN TRAN --@@TRANCOUNT值为0
SELECT @@TRANCOUNT --值为1
SAVE TRAN t1
SELECT @@TRANCOUNT --值为1
BEGIN TRAN
SELECT @@TRANCOUNT --值为2
ROLLBACK TRAN t1
SELECT @@TRANCOUNT --注意这里的值为2
IF @@TRANCOUNT>0
ROLLBACK TRAN
SELECT '处理结束', @@TRANCOUNT --为0
二、SQL SERVER中处理嵌套事务里面的错误
1、在项目中应该会常常出现这样的情况,一个存储过程里面用了事务,但是不能保证它会被别的带有事务的存储过程调用,如果单独调用的话,出现错误可以直接回滚,但是如果是被别的带事务的存储过程调用的话,RollBack 就会出错了。
2、如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码 如 -1)让上一层事务来处理这个错误,从而使@@TranCount 减1。 这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。
3、例如
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
SAVE TRANSACTION ProcedureSave;
ELSE
BEGIN TRANSACTION;
…………
--事务内要执行的代码
…………
IF @@ERROR<>0
goto Error
Commit Transaction
Commit Transaction
--下面返回要返回的值0只是个例子
Return 0
Error:
IF @TranCounter = 0
ROLLBACK TRANSACTION;
Else
ROLLBACK TRANSACTION ProcedureSave;
Return @Error
标签:SQL SERVER
您可能感兴趣
- sql server导入数据csv文件(大容量csv快速内导入sqlserver的解决方法推荐)
- sqlserver怎么手动添加数据库表(SQL Server 数据库调整表中列的顺序操作方法及遇到问题)
- sqlserver常用流控语句(SQL Server实现自动循环归档分区数据脚本详解)
- SQL Server无法连接远程数据库的解决方法
- sqlserver完全删除教程(sql server编写archive通用模板脚本实现自动分批删除数据)
- sql server 锁超时(详解SQL Server中的事务与锁问题)
- linux安装sqlserver 2008 r2(Ubuntu 下安装SQL Server教程)
- sqlserver如何查找值为null的数据(SQL Server中NULL的正确使用与空间占用)
- python实现sql脚本规范(基于Python的SQL Server数据库实现对象同步轻量级)
- sql server修改表的字段类型后,不能保存
- sql server2012表的数据删除(SQL Server删除表及删除表中数据的方法)
- SQL Server的恢复模式
- SQL Server表误删记录如何恢复
- sqlserver中有几种锁定模式(SQL Server 开窗函数 Over代替游标的使用详解)
- sqlserver查询表结构(sql server递归子节点、父节点sql查询表结构的实例)
- sql server 动态建表(SQL Server如何通过创建临时表遍历更新数据详解)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
- 白龙马的改编学生版,快来看看(白龙马的改编学生版)
- 萌娃唱《白龙马》走红,那生动的小表情,网友直呼 简直是戏精(萌娃唱白龙马走红)
- 朱鹤松被不断认可,凤凰传奇玲花喊话岳云鹏,索要老朱演出门票(朱鹤松被不断认可)
- 元宵晚会槽点多,芒果台上来就假唱,岳云鹏不说相声改评书了(元宵晚会槽点多)
热门推荐
- laravel 框架关键技术解析(在laravel框架中实现封装公共方法全局调用)
- python线程自动停止了(解决Python中定时任务线程无法自动退出的问题)
- docker怎么设置参数(浅谈docker --privileged=true参数作用)
- connectionStrings数据库连接字符串的介绍
- python数组矩阵操作(Python矩阵和Numpy数组的那些事儿)
- python 聚类找出同一类别的数据(Python实现简单层次聚类算法以及可视化)
- python带权限复制文件夹(python定时复制远程文件夹中所有文件)
- docker容器与宿主机通信(docker容器与宿主机的数据交互方式总结)
- django怎么设置数据库(django配置连接数据库及原生sql语句的使用方法)
- js实现商品添加(js实现购物网站放大镜功能)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9