我的 CTE 内部都使用了 NOLOCK。但是然后从使用子 CTE 的父 CTE 中的那些 CTE 中选择不使用 NOLOCK,因为假定它已经是 NOLOCK。并且最终选择也不使用 NOLOCK。
类似的东西:
with cte1 as
(select * from tab1 (nolock)),
cte2 as
(select * from cte1)
select * from cte2
或者我应该写
with cte1 as
(select * from tab1 (nolock)),
cte2 as
(select * from cte1 (nolock))
select * from cte2 (nolock)
谢谢
最佳答案
您不需要外部 nolock
来避免在 tab1
上获取共享锁。您可以通过设置 SQL Profiler 跟踪来轻松验证这一点,该跟踪捕获 locks
类别中的各种事件,过滤 SSMS 连接的 spid 并尝试两个版本。
nolock
是一个非常危险的设置,您是否知道使用它的所有可能缺点(脏读、读取数据两次或根本不读取)?
关于sql-server - SQL 服务器 2008 : how does NOLOCK works for CTE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607565/