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

Saj*_*udi 4 sql-server

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

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

Pre*_*red 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)在每个表上使用时尤其如此.

  • 对于`SELECT`查询,不推荐使用`WITH(NOLOCK)`.IMO表提示为您提供*更多*控制,因为它针对特定表,并不适用于每个语句中的每个表. (3认同)