【发布时间】:2016-07-18 13:38:41
【问题描述】:
我看到我公司的很多人都在这样做:
var transactionOptions = new System.Transactions.TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
{
try
{
using (DefaultContext ctx = new DefaultContext())
{
return ctx.Item.Where(x => x.State == 1);
}
}
catch (Exception err)
{
throw err;
}
finally
{
transactionScope.Complete();
}
}
我真的需要打开一个事务到一个 Select 并调用 Complete() 方法吗?我以为它只是为了数据修改......
如果正确,有人可以向我解释一下吗?这是一个好习惯还是坏习惯?不需要吗?
谢谢
【问题讨论】:
-
这似乎完全没有必要。它可能运行得很快,但我不会产生开销。我只使用带有插入和更新的作用域 txns。我看到这确实将
IsolationLevel设置为ReadUncommitted。他们这样做可能是为了提供 NOLOCK 效果。 -
ReadUncommitted允许脏读,这意味着您可能会在读取中看到来自未提交查询的数据(请参阅stackoverflow.com/questions/2471055/…),这不是默认设置,但catch/throw构造是完全没有必要的。 -
您问过贵公司的任何人为什么要这样做吗? ;) 我同意@R。理查兹,在我看来,这样做的唯一原因是使用未提交的读取隔离级别。这表明存在(或在某些时候存在)一些锁定问题正在/正在阻碍应用程序,因此 ReadUncommitted 用于避免获取读取锁定。 IMO,这是一个相当大的数据访问更改(全面使用),所以我希望有人知道完整的故事。或者也许一个人曾经这样做过,现在这是一个复制/粘贴问题。
标签: c# sql-server entity-framework transactions repository-pattern