我在MVC 5项目中使用Entity Framework 6。如您所知,SELECT如果我们在SQL Server中使用查询WITH (NOLOCK),它们将更快,更高效地执行。我检查了一些由Entity Framework 6生成的SQL SELECT语句,并意识到它们都不包含NOLOCK。
SELECT
WITH (NOLOCK)
我不想在提取操作中使用事务来读取未提交的事务。
如何强制EF 6在生成的SELECT语句下面使用NOLOCK?
首先…您永远不要对每个SQL语句使用NOLOCK。它可能会损害您数据的完整性。
就像任何其他查询提示一样,仅当您执行异常操作时才应使用该机制。
无法告诉EF提供程序呈现NoLock提示。如果您确实需要读取未提交的数据,则可以使用以下选项。
编写您自己的EntityFramework Provider。
在执行该语句之前,请使用命令拦截器对其进行修改。http://msdn.microsoft.com/en-us/data/dn469464.aspx
使用带有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