是否有可能得到LINQ2SQL发射在SQL中的NOLOCK? 如果是这样,怎么样?
Answer 1:
的确是这样,所以这里的条目从我的博客 :
NOLOCK提示是基本相同的,其“隔离级别”设置为“读未提交”事务包裹的查询。 这意味着,查询不关心的东西是被写入到它的读取行的过程 - 它会读到“脏”数据并返回它作为结果集的一部分。
事实证明,你可以做整体介绍了使用.NET 2.0中的老System.Transactions的命名空间“读未提交”交易的事情。 下面是一些示例代码:
using (var txn = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted } )) { // Your LINQ to SQL query goes here }
所以我创建一个新的TransactionScope对象,并告诉它使用读未提交的隔离级别。 “使用”的语句中的查询现在充当如果所有表都与NOLOCK提示阅读。
下面是从谷歌上搜索“LINQ SQL NOLOCK”的第一批成果:
InfoQ中文站:与LINQ实现NOLOCK to SQL和LINQ到实体
马特汉密尔顿- LINQ to SQL和NOLOCK提示:道具疯狂!
斯科特Hanselman的计算机禅-获取的LINQ to SQL和LINQ to ...
Answer 2:
继theKing的LinqPad My Extensions
另外 :
public static IQueryable<T> DumpNoLock<T>(this IQueryable<T> query)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.Dump();
}
}
public static System.Transactions.TransactionScope GetNewReadUncommittedScope()
{
return new System.Transactions.TransactionScope(
System.Transactions.TransactionScopeOption.RequiresNew,
new System.Transactions.TransactionOptions
{
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
});
}
public static IQueryable<T> DumpNoLock<T>(this IQueryable<T> query, string description)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.Dump(description);
}
}
public static List<T> ToListNoLock<T>(this IQueryable<T> query)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.ToList();
}
}
public static U NoLock<T,U>(this IQueryable<T> query, Func<IQueryable<T>,U> expr)
{
using (var txn = GetNewReadUncommittedScope())
{
return expr(query);
}
}
最后一个意味着你可以做一个NOLOCK
对你没有任何一个评估查询NoLock
明确书面(就像我已经得到了ToListNoLock
以上)。 因此,举例来说:
somequery.NoLock((x)=>x.Count()).Dump();
将评估与查询NOLOCK
。
需要注意的是,你必须确保你正在评估查询。 例如.NoLock((x)=>x.Distinct()).Count().Dump()
不会做任何事情从用地不同.Distinct().Count().Dump()
Answer 3:
一个简单的方法可能是在您的DataContext类运行命令
using (var dataContext = new DataContext())
{
dataContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
// Your SQL query
}
Answer 4:
下面是LINQPAD使用扩展方法
public static IQueryable<T> Dump2<T>(this IQueryable<T> query)
{
using (var txn = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions
{
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
}))
{
return query.Dump();
}
}
然后,你可以称呼其为:
MyTable.Where(t => t.Title = "Blah").Dump2();
Answer 5:
在我的情况下,实体框架5(基于@Soppus答案):
private FoobarEntities db = new FoobarEntities();
public FoobarController()
{
db.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
}