【问题标题】:SqlTransaction and nested transactionsSqlTransaction 和嵌套事务
【发布时间】:2011-07-05 19:11:28
【问题描述】:

是否可以使用 SqlTransaction 类创建嵌套事务?如果是这样,我需要注意哪些规则/限制?

【问题讨论】:

    标签: .net sql ado.net sqltransaction


    【解决方案1】:

    不幸的是,SQL Server 忽略了内部事务的提交,as in this MSDN article.

    您可以嵌套事务,但请注意其行为可能不是您所期望的。

    在最外层事务提交之前,什么都不会提交。

    那么,接下来……

    transaction A
    Query A
    
    transaction B
    Query B
    
    Commit B
    Rollback A
    

    查询 B 的结果实际上并未提交到数据库。

    【讨论】:

    • 这实际上是我想要的行为,但是你如何使用 SqlTransaction 类来表达呢?
    【解决方案2】:

    您可以在 SqlTransaction 类上使用Save(string savePointName) 方法。这将创建一个保存点,您可以在事务内回滚到该保存点。因此,如果您的部分代码失败,您将回滚到上一个保存点并重新开始。

    例子:

    SqlTransaction tran = _transaction as SqlTransaction;
    tran.Save(savePointName);
    

    当你失败时你会做:

    tran.Rollback(savePointName);
    

    您可以根据需要多次执行此操作。这将解决您的嵌套事务问题。

    【讨论】:

      【解决方案3】:

      是的,可以创建嵌套事务。

      例如:

      交易A 做行动#1 交易乙 做动作#2 交易C 行动#3 回滚事务 B 交易 D 做行动#4 提交事务 D 交易E 行动#5 提交事务 A

      按照这个顺序,只有动作 1、4 和 5 会实际发生。除了我知道的事务本身的限制之外,嵌套事务没有任何限制。唯一必须理解的是,在提交“顶层”(嵌套的顶部)事务之前,实际上什么都不会提交。

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 2014-12-12
        相关资源
        最近更新 更多