如果在SQL Server中的View上使用“WITH NOLOCK”查询提示,它是否会将该提示传播到视图定义本身,即使NOLOCK未用于View定义中的原始表?需要这样做的原因是,有时支持人员想要进行大量耗时的查询,但不希望使用应用程序本身内的视图强制锁定所有查询。
答案 0 :(得分:67)
是的,NOLOCK将传播到视图定义使用的表(至少在SQL Server 2005中)。
请参阅MSDN中的Table Hints:
在SQL Server 2005中,所有锁定提示都会传播到视图中引用的所有表和视图。此外,SQL Server还会执行相应的锁一致性检查。
然而,
如果表包含计算列,并且计算列是通过访问其他表中的列的表达式或函数计算的,则表提示不会在这些表上使用。这意味着表提示不会传播。例如,在查询中的表上指定了NOLOCK表提示。此表具有计算列,这些列由表达式和函数的组合计算,这些表达式和函数访问另一个表中的列。表达式和函数引用的表在访问时不使用NOLOCK表提示。
如果你正在使用索引视图,你可能想要阅读更多,因为那里也有一些特殊情况。
另请参阅View Resolution了解详情。
答案 1 :(得分:12)