关于新版SQL Server中使用WITH(NOLOCK)是否需显式指定的问询
在最新SQL Server版本中使用NOLOCK的要求
是的,在最新版本的SQL Server(包括2022及后续版本)中,必须显式指定WITH(NOLOCK)才能让SELECT语句应用这个表提示的行为。
具体说明:
- SQL Server默认的事务隔离级别是
READ COMMITTED,不会自动启用NOLOCK对应的脏读规则。不管版本如何更新,默认行为都不会改变——你不明确写,就不会生效。 - 有两种显式启用的方式:
- 单语句级别:在查询的表/视图后直接添加表提示,比如:
等价的写法也可以用SELECT Column1, Column2 FROM YourTargetTable WITH(NOLOCK);READUNCOMMITTED,效果完全一致:SELECT Column1, Column2 FROM YourTargetTable WITH(READUNCOMMITTED); - 会话级别:通过设置会话的隔离级别为
READ UNCOMMITTED,这样该会话中后续所有SELECT都会自动应用等价于NOLOCK的规则:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 之后的SELECT都会使用该隔离级别 SELECT Column1, Column2 FROM YourTargetTable;
- 单语句级别:在查询的表/视图后直接添加表提示,比如:
- 注意:NOLOCK(或READ UNCOMMITTED)会允许脏读、不可重复读和幻读,只有当你的业务场景能接受这些数据一致性风险时,才应该使用,不要为了性能盲目滥用。
内容的提问来源于stack exchange,提问作者Luis Sandoval Monestel
相关产品推荐
相关产品推荐

