在查询中使用WITH NOLOCK表提示使用视图 – 是否在视图内传播?
如果在SQL Server中的View上使用“WITH NOLOCK”查询提示,是否将该提示传播给视图定义本身,即使NOLOCK未用于View定义中的原始表格? 需要这样做的原因是,有时候,支持人员想要花费大量的时间来查询,而不是强制使用应用程序本身中的视图对所有查询进行locking。
是的,NOLOCK将传播到视图定义所使用的表(至less在SQL Server 2005中)。
请参阅MSDN中的表提示 :
在SQL Server 2005中,所有锁提示都会传播到视图中引用的所有表和视图。 此外,SQL Server执行相应的锁一致性检查。
然而,
如果一个表包含计算列,并且计算列是通过访问其他表中的列的expression式或函数计算的,则表格提示不用于这些表。 这意味着表格提示不会传播。 例如,查询中的表中指定了NOLOCK表提示。 该表计算了通过访问另一个表中的列的expression式和函数的组合计算的列。 expression式和函数引用的表在访问时不使用NOLOCK表提示。
如果你使用的索引视图,你可能想读更多一点,因为那里也有一些特殊情况。
另请参阅查看parsing更多信息。
只是为了补充罗里的优秀答案。
他写道:“是的,NOLOCK会传播到视图定义使用的表(至less在SQL Server 2005中)” 。
实际上,这也可以在SQL 2000中工作。 从BOL:
因为select_statement使用SELECT语句,所以在FROM子句中指定使用和提示是有效的。 有关更多信息,请参阅FROM和SELECT 。