博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 中的嵌套事务与@@TranCount(转)
阅读量:4480 次
发布时间:2019-06-08

本文共 1597 字,大约阅读时间需要 5 分钟。

    在处理事务的时候,一般都用RollBack Transaction来回滚,但是如果在嵌套事务中这样使用的话,就会出现错误。

在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。例如:

Begin Transaction -- @@TranCount = 1
         BeginTransaction -- @@TranCount = 2  
                  BeginTransaction -- @@TranCount = 3
                  Commit Transaction -- @@TranCount = 2
         Commit Transaction -- @@TranCount = 1
Commit Transaction -- @@TranCount = 0

如果出现错误ROLLBACK TRANSACTION

则:
Begin Transaction -- @@TranCount = 1
         BeginTransaction -- @@TranCount = 2  
                  BeginTransaction -- @@TranCount = 3
                  ROLLBACK TRANSACTION  -- @@TranCount = 0
         Commit Transaction -- @@TranCount = 0---出现错误
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
         如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码 如 -1)让上一层事务来处理这个错误,从而使@@TranCount 减1。 这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。

         在项目中应该会常常出现这样的情况,一个存储过程里面用了事务,但是不能保证它会被别的带有事务的存储过程调用,如果单独调用的话,出现错误可以直接回滚,但是如果是被别的带事务的存储过程调用的话,RollBack 就会出错了。因此需要一种机制来区分,建立一个临时的变量来区分是否嵌套,和嵌套的层数,如下:

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

转载于:https://www.cnblogs.com/kingcat/archive/2011/12/23/2299823.html

你可能感兴趣的文章
个人站立会议第二阶段07
查看>>
云时代架构阅读笔记五——Web应用安全
查看>>
IOS 单击手势和cell点击冲突
查看>>
学习_HTML5_day3
查看>>
计算机网络与应用第二次笔记
查看>>
Django之ORM查询
查看>>
学习python第七天
查看>>
Flask基础(07)-->正则自定义转换器
查看>>
C++著名程序库的比较和学习经验(STL.Boost.GUI.XML.网络等等)
查看>>
Spring Boot构建RESTful API与单元测试
查看>>
【JavaScript你需要知道的基础知识~】
查看>>
谷歌搜索语法
查看>>
static 静态变量
查看>>
Java面试题(05)
查看>>
操作符重载
查看>>
Docker 安装及问题处理
查看>>
JavaScript中的call 和apply的用途以及区别
查看>>
HashMap完全解读
查看>>
匿名内部类
查看>>
BZOJ4071: [APIO2015]八邻旁之桥
查看>>