【问题标题】:Does a TransactionScope that exists only to select data require a call to Complete()仅存在用于选择数据的 TransactionScope 是否需要调用 Complete()
【发布时间】:2010-04-29 19:30:30
【问题描述】:

为了从不受脏数据影响的应用程序部分中选择数据,我创建了一个 TransactionScope,它根据 Hanselman here 的建议指定 ReadUncommitted IsolationLevel。

我的问题是,我是否仍然需要在 using 块的末尾执行 oTS.Complete() 调用,即使此事务范围不是为了在插入、更新期间桥接 2 个数据库之间的对象依赖关系而构建的,还是删除?

例如:

List<string> oStrings = null;
using (SomeDataContext oCtxt = new SomeDataContext (sConnStr))
using (TransactionScope oTS = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
     oStrings = oCtxt.EStrings.ToList();
     oTS.Complete();
}

【问题讨论】:

  • 来自msdn.microsoft.com/en-us/library/ms172152.aspx,“当 TransactionScope 对象加入现有的环境事务时,处置范围对象可能不会结束事务,除非范围中止事务。如果环境事务是由根范围,只有在根范围被释放时,才会在事务上调用 Commit。如果事务是手动创建的,则事务在它被中止或由其创建者提交时结束。”

标签: c# linq-to-sql transactions


【解决方案1】:

如果它没有改变任何数据,那么它自己不会做任何事情——但是是的:它应该有一个Complete(),因为可能有一个围绕这个的外部事务范围。如果你的回滚,你就注定了整个外部事务。通过完成您的交易,您允许外部交易不受阻碍地继续进行。

请注意,在这种情况下Complete() 无论如何都是“免费的”;事实上,SQL Server 总是Complete() 优化,回滚(Dispose() 没有Complete())是昂贵的。

【讨论】:

    【解决方案2】:

    是的。一个事务只能以完成或回滚结束,所以如果你不完成它,它会自动回滚。即使没有要撤消的实际更改也会更加昂贵,并且可能会影响其他事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2015-09-04
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多