有没有可能让 Linq2Sql 在其 SQL 中发出 NOLOCK? 如果有,怎么做?
是的,这是入口 从我的博客:
NOLOCK 提示实质上是 类中包装查询的方法相同 其“隔离级别”为 设置为“读取未提交”,意思是 查询并不关心 正在写信给 它读取的行-它会 读取“脏”数据并返回它 作为结果集的一部分。 事实证明,你完全可以 “读取未提交”的事务 使用旧的系统。交易 .NET 2.0中引入的命名空间。 下面是一些示例代码: using (var txn = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted } )) { // Your LINQ to SQL query goes here } 因此,我正在创建一个新的 TransactionScope 对象,并告诉它使用 读取未提交隔离级别 在“ using”语句中查询 好像所有的桌子都在读 带有 NOLOCK 提示。
NOLOCK 提示实质上是 类中包装查询的方法相同 其“隔离级别”为 设置为“读取未提交”,意思是 查询并不关心 正在写信给 它读取的行-它会 读取“脏”数据并返回它 作为结果集的一部分。
事实证明,你完全可以 “读取未提交”的事务 使用旧的系统。交易 .NET 2.0中引入的命名空间。 下面是一些示例代码:
using (var txn = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted } )) { // Your LINQ to SQL query goes here }
因此,我正在创建一个新的 TransactionScope 对象,并告诉它使用 读取未提交隔离级别 在“ using”语句中查询 好像所有的桌子都在读 带有 NOLOCK 提示。
下面是 Google 搜索“ linq sql nolock”的第一个结果:
InfoQ: 使用 LINQtoSQL 和 LINQtoEntity 实现 NOLOCK
马特汉密尔顿-链接到 SQL 和 NOLOCK 提示: 疯狂的道具!
Scott Hanselman 的计算机禅宗-让 LINQtoSQL 和 LINQto..。
下面是一个与 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();
一种简单的方法可能是在 DataContext 类上运行命令
using (var dataContext = new DataContext()) { dataContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); // Your SQL query }
在我的例子中,实体框架5(基于@Soppus 答案) :
private FoobarEntities db = new FoobarEntities(); public FoobarController() { db.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); }
继国王的 增加 LinqPad My Extensions之后:
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所做的那样)。例如:
NoLock
NOLOCK
ToListNoLock
somequery.NoLock((x)=>x.Count()).Dump();
将使用 NOLOCK计算查询。
请注意,您必须确保正在计算查询。