我正在尝试编写一些查询来从数据库中获取数据。我曾经使用With(NoLock)来阻止SQL Server在数据库上放置共享锁。最近,我的一位朋友告诉我,现在的默认行为是它不会对读取数据造成任何阻碍。
但是,我找不到一个干净的解释。 我还应该在SQL Server中使用With(NoLock)吗?
答案 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文档中发现了以下语句,该语句警告在查询中使用NOLOCK
和READUNCOMMITTED
提示
注意:在将来的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