66

如果在 SQL Server 中的视图上使用“WITH NOLOCK”查询提示,它是否将该提示传播到视图定义本身,即使视图定义中的原始表不使用 NOLOCK?需要这样做的原因是,有时支持人员想要执行大量耗时的查询,但宁愿不使用应用程序本身的视图强制锁定所有查询。

4

2 回答 2

77

是的,NOLOCK 将传播到视图定义使用的表(至少在 SQL Server 2005 中)。

请参阅MSDN 中的表提示:

在 SQL Server 2005 中,所有锁定提示都传播到视图中引用的所有表和视图。此外,SQL Server 执行相应的锁一致性检查。

然而,

如果一个表包含计算列,并且计算列是由访问其他表中的列的表达式或函数计算的,则表提示不会在这些表上使用。这意味着不会传播表提示。例如,在查询中的表上指定了 NOLOCK 表提示。此表具有计算列,这些计算列是通过访问另一个表中的列的表达式和函数的组合计算得出的。表达式和函数引用的表在访问时不使用 NOLOCK 表提示。

如果您正在使用索引视图,您可能需要阅读更多内容,因为那里也有一些特殊情况。

另请参阅查看分辨率以获取更多信息。

于 2008-11-22T17:20:27.553 回答
12

只是为了补充罗里的出色答案。

他写道:“是的,NOLOCK 将传播到视图定义使用的表(至少在 SQL Server 2005 中)。”

事实上,这也适用于 SQL 2000。 来自 BOL:

因为 select_statement 使用 SELECT 语句,所以使用 FROM 子句中指定的提示是有效的。有关详细信息,请参阅FROMSELECT

于 2009-02-03T01:46:02.720 回答