背景:我有一个关键的疑问,我想运行,我不在乎肮脏的阅读。

我的问题是;如果我使用的是加入,是否还必须指定有关这些提示的提示?

例如;是:

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 总是比给出单独的锁提示更好。或者,如果您关心诸如 一致性, , 采用 快照隔离.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top