tsql - "ROLLBACK TRANSACTION named_transaction"有什么意义?

标签 tsql sql-server-2008 transactions rollback

我在 ROLLBACK TRANSACTION 上通读了 MSDN和 nesting transactions .虽然我看到了ROLLBACK TRANSACTION savepointname的观点,看不懂ROLLBACK TRANSACTION transactionname .

  • 它仅在 transactionname 时有效是最外层交易
  • ROLLBACK总是回滚整个事务“堆栈”,除非 savepointname

  • 基本上,当我阅读文档时,除了保存点,ROLLBACK回滚所有事务(到 @@TRANCOUNT=0 )。我能看到的唯一区别是这个片段:

    If a ROLLBACK TRANSACTION transaction_name statement using the name of the outer transaction is executed at any level of a set of nested transactions, all of the nested transactions are rolled back. If a ROLLBACK WORK or ROLLBACK TRANSACTION statement without a transaction_name parameter is executed at any level of a set of nested transaction, it rolls back all of the nested transactions, including the outermost transaction.



    从阅读中,这向我表明回滚命名事务(必须是最外层事务的名称),只会回滚嵌套事务。这将为回滚命名事务提供一些意义。所以我设置了一个测试:
    CREATE TABLE #TEMP (id varchar(50))
    
    INSERT INTO #TEMP (id) VALUES ('NO')
    SELECT id AS NOTRAN FROM #TEMP
    SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT
    
    BEGIN TRAN OUTERTRAN
    
    INSERT INTO #TEMP (id) VALUES ('OUTER')
    SELECT id AS OUTERTRAN FROM #TEMP
    SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT
    
    BEGIN TRAN INNERTRAN
    
    INSERT INTO #TEMP (id) VALUES ('INNER')
    SELECT id AS INNERTRAN FROM #TEMP
    SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT
    
    ROLLBACK TRAN OUTERTRAN
    
    IF @@TRANCOUNT > 0 ROLLBACK TRAN
    
    SELECT id AS AFTERROLLBACK FROM #TEMP
    SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT
    
    DROP TABLE #TEMP
    

    结果(删除了所有“受影响的 X 行”内容)
    NOTRAN
    --------------------------------------------------
    NO
    
    NOTRAN_TRANCOUNT
    ----------------
    0
    
    OUTERTRAN
    --------------------------------------------------
    NO
    OUTER
    
    OUTERTRAN_TRANCOUNT
    -------------------
    1
    
    INNERTRAN
    --------------------------------------------------
    NO
    OUTER
    INNER
    
    INNERTRAN_TRANCOUNT
    -------------------
    2
    
    AFTERROLLBACK
    --------------------------------------------------
    NO
    
    AFTERROLLBACK_TRANCOUNT
    -----------------------
    0
    

    请注意,当我更改时,输出没有区别
    ROLLBACK TRAN OUTERTRAN
    

    简单地
    ROLLBACK TRAN
    

    那么ROLLBACK TRANSACTION named_transaction的意义何在? ?

    最佳答案

    保存点顾名思义:日志序列中的“保存点”。日志序列始终是线性的。如果您回滚到一个保存点,您将回滚您的事务在当前日志位置和保存点之间所做的一切。考虑你的例子:

    LSN 1: BEGIN TRAN OUTERTRAN
    LSN 2: INSERT INTO ...
    LSN 3: BEGIN TRAN INNERTRAN
    LSN 4: INSERT INTO ...
    LSN 5: ROLLBACK TRAN OUTERTRAN
    

    在日志序列号 (LSN) 1 处创建了 OUTERTRAN 保存点。第一个 INSERT 创建 LSN 2。然后 INNERTRAN 创建一个带有 LSN 3 的保存点。第二个 INSERT 创建一个新的 LSN,4。ROLLBACK OUTERTRAN 相当于“ROLLBACK 日志,直到 LSN 1”。您不能“跳过”部分日志,因此您必须回滚日志中的每个操作,直到命中 LSN 1(创建保存点 OUTERTRAN 时)。

    另一方面,如果在最后一次操作中您将发出 ROLLBACK INERTRAN,引擎将回滚直到 LSN 3(其中“INNERTRAN”保存点插入日志中),从而保留 LSN 1 和 LSN 2(即第一个 INSERT )。

    有关保存点的实际示例,请参阅 Exception handling and nested transactions .

    关于tsql - "ROLLBACK TRANSACTION named_transaction"有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1813769/

    相关文章:

    sql - 选择表中的人员并排除妻子,但合并他们的名字

    sql - 在 SQL Server 中修剪前导零的更好技术?

    sql-server - 如何在SQL中提取方括号之间的文本

    java - .NET SQL 插入速度比 JDBC 慢? (JDBC 快 4 倍)

    java - db2 jdbc 驱动程序不释放表锁

    sql-server - SQL 返回特定年份以来的年份列表

    .net - 在图例部分显示数据点值。 SSRS

    python - 我可以将 Python Pandas 数据框导出到 MS SQL 吗?

    architecture - System.Transactions 中避免事务升级的策略

    ruby-on-rails - 进行大型事务时 Validates_uniqueness_of 不起作用