NOLOCK使用LINQ到SQL(NOLOCK with Linq to SQL)

2019-06-17 22:57发布

是否有可能得到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");
}


文章来源: NOLOCK with Linq to SQL
标签: linq-to-sql