sql-server - SQL 服务器 2008 : how does NOLOCK works

我的 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/

相关文章:

php - 可以使用 PHP ImageMagick 获得透明渐变吗?

datetime - R:计算2个数字时间之间耗时,例如944和1733是469分钟

hsqldb - 使用序列将 Liquibase 数据加载到 HSQLDB

.net - 重性高潮不起作用

php - 如何在任何给定日期之前获得本周的周末?

sql-server - T-SQL 固定宽度输出

sql-server - SQL Server 数据库还原卡在 99%

windows - Perl 中的“打开”语句拆分包含空格的路径 - 如何读取路径中包含空格的文件?

php - 如何在 PHP 中使用 substr_count() 计算空格

opengl - 如何将 "clear color"插入属性堆栈