首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server NOLOCK和joins

SQL Server NOLOCK和joins
EN

Stack Overflow用户
提问于 2010-09-24 09:02:44
回答 3查看 207.2K关注 0票数 174

背景:我有一个性能关键型查询要运行,并且我不关心脏读。

我的问题是:如果我使用joins,我是否也必须在这些连接上指定NOLOCK提示?

例如;是:

代码语言:javascript
复制
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

等同于:

代码语言:javascript
复制
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

或者,我是否需要在连接上指定(NOLOCK)提示,以确保我没有锁定连接的表?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-24 23:09:41

我不会讨论READ UNCOMMITTED的争论,只讨论你最初的问题。

是的,您需要在连接的每个表上使用WITH(NOLOCK)。不,您的查询不是相同的。

试试这个练习。开始一个事务并在table1和table2中插入一行。暂时不要提交或回滚事务。此时,第一个查询将成功返回并包含未提交的行;第二个查询不会返回,因为table2没有WITH(NOLOCK)提示。

票数 187
EN

Stack Overflow用户

发布于 2010-09-24 10:04:40

我非常确定您需要为查询中的每个JOIN指定NOLOCK。但我的经验仅限于SQL Server 2005。

当我查找MSDN进行确认时,我找不到任何确定的东西。下面的陈述似乎确实让我认为,对于2008年,你上面的两个陈述是等价的,尽管2005年不是这样的:

SQL Server2008 R2

所有锁提示都将传播到查询计划可通过访问的所有表和视图,包括视图中引用的表和视图。此外,SQL Server还会执行相应的锁一致性检查。

SQL Server2005

在SQL Server2005中,所有锁提示都会传播到视图中引用的所有表和视图。此外,SQL Server还会执行相应的锁一致性检查。

此外,请注意-这适用于2005年和2008年:

如果查询计划未访问表,则忽略表提示。这可能是因为优化器选择根本不访问表,或者因为访问的是索引视图。在后一种情况下,可以使用OPTION (EXPAND VIEWS)查询提示阻止访问索引视图。

票数 19
EN

Stack Overflow用户

发布于 2010-09-24 10:25:04

都不是。您可以将隔离级别设置为READ UNCOMMITTED,这总比提供单独的锁提示要好。或者,更好的是,如果你关心像consistency这样的细节,使用snapshot isolation

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3783525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档