仅存在于选择数据的TransactionScope是否需要调用Complete()

时间:2010-04-29 19:30:30

标签: c# linq-to-sql transactions

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

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

例如:

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();
}

2 个答案:

答案 0 :(得分:7)

如果它没有更改任何数据,那么本身不会做任何事情 - 但是是:应该Complete(),因为那里可能是围绕这个的外部事务范围。如果你的回滚,你已经注定了整个外部交易。通过完成交易,您可以允许外部交易继续畅通无阻。

请注意,此方案中的Complete()无论如何都是“免费的”;事实上,SQL Server 总是优化Complete(),回滚(Dispose()没有Complete())是昂贵的。

答案 1 :(得分:1)

是。事务只能以完成或回滚结束,因此如果您没有完成它,它将自动回滚。即使没有实际的撤消更改,这也会更加昂贵,并且可能会影响其他交易。