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聚焦移除Bookmark Lookup、RID Lookup、Key Lookup)
- sql server2008无法连接怎么办(SQL Server 2008 R2登录失败的解决方法)
- sqlserver常用流控语句(SQL Server实现自动循环归档分区数据脚本详解)
- sqlserver分页查询sql语句(sql server实现分页的方法实例分析)
- sqlserver常用基本数据类型有哪些(浅述SQL Server的语句类别 数据库范式 系统数据库组成)
- sqlserver怎么调成混合登录(如何快速删掉SQL Server登录时登录名下拉列表框中的选项)
- sqlserver如何可视化表(sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日)
- SQL Server中SQL语句或者存储过程的最大长度
- sql server中随机函数NewID()和Rand()
- sql server 高并发update 死锁(解密新型SQL Server无文件持久化恶意程序的问题)
- sqlserver 插入数据的触发器(SQL server 表数据改变触发发送邮件的方法)
- sqlserver中根据类型分组(SQL SERVER 分组求和sql语句)
- sqlserver厉害的函数(SQL Server里书签查找的性能伤害)
- 利用数据库安装centos7(CentOS安装SQL Server vNext CTP1教程)
- sql 如何拆分字符串(SQL Server实现将特定字符串拆分并进行插入操作的方法)
- sqlserver备份还原数据(通过Windows批处理命令执行SQL Server数据库备份)
- 赵丽颖第一部当女主的戏,主角配角个个都是实力演员(赵丽颖第一部当女主的戏)
- 乾隆为何这么喜爱白塔原因是什么(乾隆为何这么喜爱白塔原因是什么)
- 逐渐消失的东北八大怪现象,进步的社会里我们遗失的是什么(逐渐消失的东北八大怪现象)
- 今日大雪,大雪养生这样做,一年都有好气色(大雪养生这样做)
- 粗盐是什么 粗盐的功效与作用(粗盐的功效与作用)
- 会 吃人 的客机 从天堂到地狱只需5分钟,图-104如何做到(会吃人的客机)
热门推荐
- python 百度搜索结果(Python模拟百度自动输入搜索功能的实例)
- dede模板如何修改(dede文章页面如何显示作者的头像默认只能显示作者用户名)
- sqlserver触发器编写(SQLSever中的触发器基本语法与作用)
- django框架运行流程(Django+Xadmin构建项目的方法步骤)
- web开发如何正确使用docker(Docker部署web项目的实现)
- php抽奖功能(php+lottery.js实现九宫格抽奖功能)
- python ip代理池(Python 实现域名解析为ip的方法)
- python计算csv的行数(对Python 多线程统计所有csv文件的行数方法详解)
- linux用nvm安装nodejs(nodejs管理工具nvm安装过程详解)
- 常见的.NET面试题及推荐答案(一)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9