我还应该在SQL Server查询中使用With(NoLock)吗?

时间:2017-12-12 07:01:33

标签: sql-server

我正在尝试编写一些查询来从数据库中获取数据。我曾经使用With(NoLock)来阻止SQL Server在数据库上放置共享锁。最近,我的一位朋友告诉我,现在的默认行为是它不会对读取数据造成任何阻碍。

但是,我找不到一个干净的解释。 我还应该在SQL Server中使用With(NoLock)吗?

3 个答案:

答案 0 :(得分:5)

WITH (NOLOCK)的行为与将事务隔离级别设置为READ UNCOMMITTED的行为相同,只是其范围不同。

但是,请记住,根据您运行的查询类型,允许SQL Server使用不同的隔离级别。 (INSERT,UPDATE,DELETE和其他写操作必须至少在READ COMMITTED下运行。)

您的朋友不对,SQL Server将在对表的读操作期间至少获取一个模式锁,以防止更改表的结构。即使您使用READ UNCOMMITTED隔离级别或WITH (NOLOCK)提示,此锁也将应用于表。

一般情况下,我会避免使用WITH (NOLOCK)提示。使用表提示时,您可以减少控制。如果可以接受脏读,请使用READ UNCOMMITTED隔离级别进行连接。

您始终可以更改连接的隔离级别,但无法动态删除WITH (NOLOCK)提示。当您在每个表上使用WITH (NOLOCK)时尤其如此。

答案 1 :(得分:1)

我在Microsoft文档中发现了以下语句,该语句警告在查询中使用NOLOCKREADUNCOMMITTED提示

  

注意:在将来的SQL Server版本中,将删除对FROM子句中应用于UPDATE或DELETE语句的目标表的READUNCOMMITTED和NOLOCK提示的支持。避免在新的开发工作中使用这些提示,并计划修改当前使用它们的应用程序。

您可以查看链接https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table中的文档以获取更多信息。没有提到它是默认行为。

答案 2 :(得分:1)

Deprecated Database Engine Features in SQL Server 2017

不推荐使用的功能

  

在UPDATE的FROM子句中指定NOLOCK或READUNCOMMITTED   或DELETE语句。

替换

  

从FROM中删除NOLOCK或READUNCOMMITTED表提示   条款。

功能名称

  

在更新或删除中为NOLOCK或READUNCOMMITTED