在事务外使用with (nolock)是否有意义?SQL查询相关使用疑问
with (nolock)使用相关问题解答 认知正误判断:with (nolock)仅可在事务内部使用?
这个认知是错误的。with (nolock)是SQL Server提供的表级查询提示,核心作用是强制当前查询对目标表使用*读未提交(READ UNCOMMITTED)*隔离级别,该语法不依赖显式事务,你可以在任意普通SELECT查询的表名后直接添加,不需要包裹在BEGIN TRANSACTION/COMMIT的事务块中。
无显式事务场景下使用with (nolock)的价值
该场景下with (nolock)仍然有实际作用,核心逻辑如下:
- 哪怕你没有在业务代码中手动开启事务,SQL Server执行任意增删改操作时,都会默认开启隐式事务,操作执行完成后自动提交。这些增删改操作运行过程中,会对涉及的行、页甚至表加排他锁,默认读提交隔离级别下的普通查询,需要等待排他锁释放才能获取共享锁读取数据,就会出现查询阻塞。
- 加了
with (nolock)的查询不会申请共享读锁,也不会等待增删改的排他锁释放,直接读取磁盘上的最新数据(包括未提交的脏数据),既不会被写入操作阻塞,也不会阻塞其他写入操作,在非强一致性要求的查询场景下可以有效降低数据库锁冲突概率,提升查询响应速度。
额外提醒:
with (nolock)本身有明确的副作用:会读到未提交的脏数据,也可能出现重复读、幻读,极端情况下还会因为数据页移动触发查询报错,不建议不加区分地作为所有查询的标准写法,对数据一致性要求高的业务场景禁止使用。
内容的提问来源于stack exchange,提问作者Greg Gum
相关产品推荐
相关产品推荐

