一尘不染

获取实体框架6在其SELECT语句下使用NOLOCK

sql

我在MVC 5项目中使用Entity Framework 6。如您所知,SELECT如果我们在SQL Server中使用查询WITH (NOLOCK),它们将更快,更高效地执行。我检查了一些由Entity Framework 6生成的SQL
SELECT语句,并意识到它们都不包含NOLOCK。

我不想在提取操作中使用事务来读取未提交的事务。

如何强制EF 6在生成的SELECT语句下面使用NOLOCK?


阅读 157

收藏
2021-03-17

共1个答案

一尘不染

首先…您永远不要对每个SQL语句使用NOLOCK。它可能会损害您数据的完整性。

就像任何其他查询提示一样,仅当您执行异常操作时才应使用该机制。

无法告诉EF提供程序呈现NoLock提示。如果您确实需要读取未提交的数据,则可以使用以下选项。

  1. 编写您自己的EntityFramework Provider。

  2. 在执行该语句之前,请使用命令拦截器对其进行修改。http://msdn.microsoft.com/en-us/data/dn469464.aspx

  3. 使用带有IsolationLevel.ReadUncommited的TransactionScope。

我知道您说过您不想使用事务,但这是读取未提交数据的唯一现成的方式。而且由于SQL Server中的每个语句“简单地”在事务中运行,因此不会产生太多开销。

using (new TransactionScope(
                    TransactionScopeOption.Required, 
                    new TransactionOptions 
                    { 
                         IsolationLevel = IsolationLevel.ReadUncommitted 
                    })) 
{
        using (var db = new MyDbContext()) { 
            // query
        }
}

编辑: 同样要注意的是,Microsoft自SQL Server 2016起已弃用NOLOCK for Updates and
Deletes(选择保持不变),并将在“ a”以后的版本中将其删除。

https://docs.microsoft.com/zh-cn/sql/database-engine/deprecated-database-
engine-features-in-sql-server-2016?view=sql-
server-2017

2021-03-17