• 嵌套事务


    嵌套事务

    SQL Server 2008 R2
     

    显式事务可以嵌套。这主要是为了支持存储过程中的一些事务,这些事务可以从已在事务中的进程调用,也可以从没有活动事务的进程中调用。

    下列示例显示了嵌套事务的用途。TransProc 过程强制执行其事务,而不管执行事务的进程的事务模式。如果在事务活动时调用 TransProc,很可能会忽略 TransProc 中的嵌套事务,而根据对外部事务采取的最终操作提交或回滚其 INSERT 语句。如果由不含未完成事务的进程执行 TransProc,则在该过程结束时,COMMIT TRANSACTION 将有效地提交 INSERT 语句。

     
     
    SET QUOTED_IDENTIFIER OFF;
    GO
    SET NOCOUNT OFF;
    GO
    USE AdventureWorks2008R2;
    GO
    CREATE TABLE TestTrans(Cola INT PRIMARY KEY,
                   Colb CHAR(3) NOT NULL);
    GO
    CREATE PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3) AS
    BEGIN TRANSACTION InProc
    INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
    INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
    COMMIT TRANSACTION InProc;
    GO
    /* Start a transaction and execute TransProc. */
    BEGIN TRANSACTION OutOfProc;
    GO
    EXEC TransProc 1, 'aaa';
    GO
    /* Roll back the outer transaction, this will
       roll back TransProc's nested transaction. */
    ROLLBACK TRANSACTION OutOfProc;
    GO
    EXECUTE TransProc 3,'bbb';
    GO
    /* The following SELECT statement shows only rows 3 and 4 are 
       still in the table. This indicates that the commit
       of the inner transaction from the first EXECUTE statement of
       TransProc was overridden by the subsequent rollback. */
    SELECT * FROM TestTrans;
    GO
    

    SQL Server 数据库引擎将忽略内部事务的提交。根据最外部事务结束时采取的操作,将提交或者回滚内部事务。如果提交外部事务,也将提交内部嵌套事务。如果回滚外部事务,也将回滚所有内部事务,不管是否单独提交过内部事务。

    对 COMMIT TRANSACTION 或 COMMIT WORK 的每个调用都应用于最后执行的 BEGIN TRANSACTION。如果嵌套 BEGIN TRANSACTION 语句,那么 COMMIT 语句只应用于最后一个嵌套的事务,也就是在最内部的事务。即使嵌套事务内部的 COMMIT TRANSACTION transaction_name 语句引用外部事务的事务名称,该提交也只应用于最内部的事务。

    ROLLBACK TRANSACTION 语句的 transaction_name 参数引用一组命名嵌套事务的内部事务是非法的,transaction_name 只能引用最外部事务的事务名称。如果在一组嵌套事务的任意级别执行使用外部事务名称的 ROLLBACK TRANSACTION transaction_name 语句,那么所有嵌套事务都将回滚。如果在一组嵌套事务的任意级别执行没有 transaction_name 参数的 ROLLBACK WORK 或 ROLLBACK TRANSACTION 语句,那么所有嵌套事务都将回滚,包括最外部事务。

    @@TRANCOUNT 函数记录当前事务的嵌套级别。每个 BEGIN TRANSACTION 语句使 @@TRANCOUNT 增加 1。每个 COMMIT TRANSACTION 或 COMMIT WORK 语句使 @@TRANCOUNT 减去 1。没有事务名称的 ROLLBACK WORK 或 ROLLBACK TRANSACTION 语句将回滚所有嵌套事务,并使 @@TRANCOUNT 减小到 0。使用一组嵌套事务中最外部事务的事务名称的 ROLLBACK TRANSACTION 将回滚所有嵌套事务,并使 @@TRANCOUNT 减小到 0。在无法确定是否已经在事务中时,可以用 SELECT @@TRANCOUNT 确定 @@TRANCOUNT 是等于 1 还是大于 1。如果 @@TRANCOUNT 等于 0,则表明不在事务中。

  • 相关阅读:
    Repeater自定义翻页 存储过程实现
    Redis常用命令
    常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
    网站转接支付宝解决方案
    如何有效抓取SQL Server的BLOCKING信息
    SVN 冲突文件详解
    JavaScript可否多线程? 深入理解JavaScript定时机制
    MS SQL Server:分区表、分区索引详解
    支付宝外部商家购物流程
    排查数据库性能的常用sql语句
  • 原文地址:https://www.cnblogs.com/kingangWang/p/2280242.html
Copyright © 2020-2023  润新知