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

for*_*reh 2 c# transactions linq-to-sql

为了从不受脏数据影响的应用程序的一部分中选择数据,我创建了一个TransactionScope,根据Hanselman的建议在指定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();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 7

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

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