代码之家  ›  专栏  ›  技术社区  ›  ispiro

我需要“transactionScope.Complete();”吗?

  •  7
  • ispiro  · 技术社区  · 7 年前

    据我所知,使用 TransactionScope 就是经常打电话 transactionScope.Complete(); 在退出 using 街区。这样地:

    using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
    {
        //...
        //I'm using this as a NOLOCK-alternative in Linq2sql.
        transactionScope.Complete();
    }
    

    然而,我看到代码在没有它的情况下可以工作,甚至 the answer I've learnt to use it from

    3 回复  |  直到 7 年前
        1
  •  13
  •   Dan Guzman    7 年前

    所以我的问题是,是否必须使用它?

    Complete COMMIT 交易。否则,事务管理器将发出 ROLLBACK 并撤消所做的更改。

    对于像您的示例这样的只读事务,我想不出有无任何实质性差异 承诺

    虽然这不是调用的要求 完整的 完整的 他失踪了。

        2
  •  3
  •   Diego Osornio flaudre    7 年前

    是的,您需要使用它,这是一种通知编译器您已成功完成任务的方式,通过Microsoft文档 TransactionScope 类别:

    Complete 方法:

        3
  •  1
  •   H-a-Neo    7 年前

    基本上,using语句在编译时由C#编译器转换为该语句

           TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
            try
            {
               //your works
            }
            finally
            {
                if (transactionScope != null)
                    ((IDisposable)transactionScope).Dispose();
            }
    

    这就是你对C#的期望。。。。你只需要用TransactionScope做你的工作

    using语句确保即使发生异常,也会调用TransactionScope对象的Dispose方法。Dispose方法标记事务作用域的结束。调用此方法后发生的异常可能不会影响事务。此方法还将环境事务恢复到以前的状态。

    如果作用域创建事务并中止该事务,则会引发TransactionBortedException。如果事务管理器无法达成提交决策,则会引发TransactionDoutException。如果事务已提交,则不会引发异常。

    希望你能明白这一点