SQL Server Nolock和Joins
-
04-10-2019 - |
题
背景:我有一个关键的疑问,我想运行,我不在乎肮脏的阅读。
我的问题是;如果我使用的是加入,是否还必须指定有关这些提示的提示?
例如;是:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID
相当于:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID
还是我需要指定 (NOLOCK)
提示加入以确保我不会锁定连接的桌子?
解决方案
我不会解决 READ UNCOMMITTED
争论,只是您最初的问题。
是的,你需要 WITH(NOLOCK)
在加入的每个表上。不,您的查询不一样。
尝试此练习。开始交易,然后将一行插入Table1和Table2。不要提交或回滚交易。此时,您的第一个查询将成功返回,并包含未投入的行;您的第二个查询不会返回,因为Table2没有 WITH(NOLOCK)
暗示它。
其他提示
我很确定您需要指定 NOLOCK
每个 JOIN
在查询中。但是我的经验仅限于SQL Server 2005。
当我查找MSDN只是为了确认时,我找不到任何确定的东西。下面的陈述似乎确实使我认为,对于2008年,您上面的两个陈述是同等的,尽管事实并非如此:
SQL Server 2008 R2
所有锁定提示都传播到所有表和视图 查询计划访问, ,包括视图中引用的表和视图。此外,SQL Server执行相应的锁定性检查。
SQL Server 2005
在SQL Server 2005中,所有锁定提示都将传播到视图中引用的所有表和视图。此外,SQL Server执行相应的锁定性检查。
此外,注意点 - 这适用于2005年和2008年:
如果查询计划未访问表,则表提示将忽略。这可能是由于优化器选择根本不访问表,或者是因为访问索引视图而引起的。在后一种情况下,可以通过使用
OPTION (EXPAND VIEWS)
查询提示。
两者都不。您将隔离级设置为 READ UNCOMMITTED
总是比给出单独的锁提示更好。或者,如果您关心诸如 一致性, , 采用 快照隔离.