如果在SQL Server中的视图上使用了“ WITH NOLOCK”查询提示,即使没有将NOLOCK用于视图定义中的原始表,它也会将该提示传播到视图定义本身吗?之所以需要这样做,是因为有时支持人员希望执行大量耗时的查询,而宁愿不使用应用程序内部的视图对所有查询强制使用此锁定。
是的,NOLOCK将传播到视图定义所使用的表(至少在SQL Server 2005中)。
请参阅MSDN中的表提示:
在SQL Server 2005中,所有锁定提示都传播到视图中引用的所有表和视图。此外,SQL Server执行相应的锁一致性检查。
然而,
如果表包含计算列,并且计算列由访问其他表中列的表达式或函数计算,则这些表上不使用表提示。这意味着表提示不会传播。例如,在查询的表上指定了NOLOCK表提示。该表具有计算的列,这些列是通过访问另一个表中的列的表达式和函数的组合来计算的。表达式和函数引用的表在访问时不使用NOLOCK表提示。
如果您使用索引视图,则可能还需要阅读更多内容,因为那里也有一些特殊情况。
另请参阅查看分辨率以获取更多信息。