首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在要连接到自己的表上使用NOLOCK

在要连接到自己的表上使用NOLOCK
EN

Stack Overflow用户
提问于 2014-08-26 21:37:44
回答 3查看 935关注 0票数 3

我正在处理一个糟糕的视图,它内部将许多、多个表连接在一起,其中一些表是同一个表。

我想知道,当一个表被连接到自己时,如果它在一个连接上而不是另一个连接上,那么如何解释NOLOCK提示呢?NOLOCK是否仍然在表上有效,或者如果NOLOCK未包含在同一表的一个联接中,则该表是否完全锁定?

例如(这是pseduo代码,假设存在有效的JOIN ON条件):

代码语言:javascript
复制
SELECT *
FROM Table1 t1 (NOLOCK)
JOIN Table2 t2 (NOLOCK)
JOIN Table2_Table2 tt (NOLOCK)
JOIN Table2 t22 (NOLOCK)
JOIN Table1 t11

Table1是被锁了还是NOLOCK被锁了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-26 22:29:20

是的,上一次Table1 t11电话确实把它锁上了。每个表锁定提示都应用于特定的引用。如果仅将其应用于仅用于该引用的表引用之一,则其他表引用将具有各自的锁定设置。您可以使用BEGIN TRANSACTION对其进行测试,并执行两个不同的查询。

查询1(锁定表)有意注释掉COMMIT TRANSACTION

代码语言:javascript
复制
BEGIN TRANSACTION
SELECT *
FROM Table1 WITH (TABLOCK)
-- COMMIT TRANSACTION

由于COMMIT TRANSACTION已被注释掉,事务未被关闭,仍将保持锁。当第二个查询运行时,第一个锁仍然适用于第一个查询中的表。

查询2(此查询将挂起,因为第一个锁将阻塞在Table1 t11上)

代码语言:javascript
复制
BEGIN TRANSACTION
SELECT *
FROM Table1 t1 (NOLOCK)
JOIN Table2 t2 (NOLOCK)
JOIN Table2_Table2 tt (NOLOCK)
JOIN Table2 t22 (NOLOCK)
JOIN Table1 t11
COMMIT TRANSACTION
票数 1
EN

Stack Overflow用户

发布于 2014-08-26 22:13:53

我猜想,不使用nolock将导致某种类型的锁定,而不管它是否与nolock连接在查询的其他地方。因此,这可能会导致行锁,因此将nolock放在缺少它的联接旁边。

票数 0
EN

Stack Overflow用户

发布于 2014-08-26 22:20:46

用非常简单的术语来说,可以这样想:在查询中引用的每个表都会导致物理执行计划操作符访问该表。表提示适用于该运算符。这意味着您可以为同一个表提供混合锁定提示。您请求的锁定行为将应用于该特定运算符碰巧读取的行。相应的运算符可能扫描表,或扫描一系列行,或读取单行。不管是什么,它都是在指定的锁定选项下执行的。

查看查询的执行计划,以找到各个操作符。

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

https://stackoverflow.com/questions/25515547

复制
相关文章

相似问题

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