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
您可能感兴趣
- sqlserver列数据拆分(SQL Server基础之行数据转换为列数据)
- sql server修改sa密码(sqlserver添加sa用户和密码的实现)
- SQL Server将数据导出到SQL脚本文件
- SQL Server中GROUPING SETS
- sql server事务回滚(SQL Server 添加Delete操作回滚日志方式)
- sql server 锁超时(详解SQL Server中的事务与锁问题)
- sql server代理无法启动服务(SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法)
- kettle替换sql语句(sql server定时作业调用Kettle job出错的快速解决方法)
- Sql Server常用系统存储过程
- centos安装sql server(Centos 7.3下SQL Server安装配置方法图文教程)
- sqlserver非唯一索引汇总性能(详解SQL Server的聚焦过滤索引)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- sql server锁原理(Sql Server 死锁的监控分析解决思路)
- sqlserver查询信息表(SQL Server中Table字典数据的查询SQL示例代码)
- sqlserver日志目录是否过大(SQL Server利用sp_spaceused如何查看表记录存在不准确的情况)
- sqlserver表分区步骤(行转列之SQL SERVER PIVOT与用法详解)
- 吴彦祖陈冠希 恩怨 ,失去曾让他流泪的女友,终遇走过18年真爱(吴彦祖陈冠希恩怨)
- 痴情男神 吴彦祖 与妻子恋爱8年,结婚10年,家庭幸福美满(痴情男神吴彦祖)
- 成功破圈,小牛电动SQi强势开 跨(小牛电动SQi强势开)
- 挑战新国标电自天花板,九号机械师MMAX 110P深度体验(挑战新国标电自天花板)
- 《满江红》不要只当电影看,学生应该这样做(满江红不要只当电影看)
- 电影《民间怪谈录之走阴人》定档8月5日,开启一场中式惊悚之旅(电影民间怪谈录之走阴人定档8月5日)
热门推荐
- 微信小程序图片加特效(微信小程序实现可实时改变转速的css3旋转动画实例代码)
- jquery插件开发
- linuxdocker启动报错提示参数无效(docker 报错 Exited 1 4 minutes ago的原因分析)
- yii2支持php7.2吗(Yii框架通过请求组件处理get,post请求的方法分析)
- javascript中定义数组的方法(JavaScript中数组sort方法的基本使用与踩坑记录)
- pyinstaller如何打包成exe文件(利用pyinstaller打包exe文件的基本教程)
- apache 配置域名(apache 二级域名解析 window与linux)
- python中可以改变的数据类型(Python常见数据类型转换操作示例)
- docker进入mysql查看路径(Docker 环境运行 Mysql 和开启 Binlog 配置主从同步的设置方法)
- python实现七个基本算法(python实现维吉尼亚算法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9