为了从不受脏数据影响的应用程序的一部分中选择数据,我创建了一个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();
}
答案 0 :(得分:7)
如果它没有更改任何数据,那么本身不会做任何事情 - 但是是:应该有Complete()
,因为那里可能是围绕这个的外部事务范围。如果你的回滚,你已经注定了整个外部交易。通过完成交易,您可以允许外部交易继续畅通无阻。
请注意,此方案中的Complete()
无论如何都是“免费的”;事实上,SQL Server 总是优化Complete()
,回滚(Dispose()
没有Complete()
)是昂贵的。
答案 1 :(得分:1)
是。事务只能以完成或回滚结束,因此如果您没有完成它,它将自动回滚。即使没有实际的撤消更改,这也会更加昂贵,并且可能会影响其他交易。