Bop*_*Bop 2 sql-server sql-server-2008
我有 CTE,里面都使用 NOLOCK。但随后使用子 CTE 从父 CTE 中的那些 CTE 中进行选择时,不会使用 NOLOCK,因为假定它已经是 NOLOCK。并且最终的选择也不使用NOLOCK。
像这样的东西:
with cte1 as
(select * from tab1 (nolock)),
cte2 as
(select * from cte1)
select * from cte2
Run Code Online (Sandbox Code Playgroud)
或者我应该写
with cte1 as
(select * from tab1 (nolock)),
cte2 as
(select * from cte1 (nolock))
select * from cte2 (nolock)
Run Code Online (Sandbox Code Playgroud)
谢谢
您不需要外部nolock来避免对 进行共享锁定tab1。您可以通过设置 SQL Profiler 跟踪来捕获类别中的各种事件locks、过滤 SSMS 连接的 spid 并尝试这两个版本来轻松验证这一点。
nolock虽然这是一个相当危险的设置,您是否知道使用它的所有可能的缺点(脏读、读取数据两次或根本不读取)?