一个SELECT如何阻止另一个SELECT?

问题描述 投票:3回答:2

我正在看 SP_WhoIsActive 在SQL Server 2005上,它告诉我一个会话阻塞了另一个会话--很好。 然而它们都在运行一个SELECT。 一个SELECT怎么会阻塞另一个呢? 它们不是都应该获取共享锁(彼此兼容)吗?

一些更多的细节。两个会话都没有打开的事务数--所以它们是独立的。

这些查询将一个视图与一个表连接起来。

它们是复杂的查询,连接了很多表,结果是10,000次左右的读取。

非常感谢任何见解。

sql-server tsql concurrency blocking
2个回答
5
投票

SELECT语句可能会阻塞另一条SELECT语句。你可能会想,既然两者都只获得S锁,那么它们就不应该阻塞。但阻塞发生在各种类型的资源上,而不仅仅是锁。典型的例子就是内存约束。我试着在这里挖出最近一个问题的答案,曾附上一个死锁图,显示到SELECT语句,一个在等待另一个的并行交换操作符内存资源(缓冲器)。

更新了这里是我说的死锁信息的链接。我有关于死锁的数据,但我不明白为什么会出现死锁如果你研究死锁图,你会注意到等待列表中的以下资源。

<exchangeEvent id="Pipe894b0680" WaitType="e_waitPipeGetRow" nodeId="0">
  <owner-list>
    <owner id="process824df048"/>
  </owner-list>
  <waiter-list>
    <waiter id="process86ce0988"/>
  </waiter-list>
</exchangeEvent>

这不是一个锁,是一个 "e_waitPipeGetRow "资源,由一个SELECT拥有,而另一个SELECT正在等待它。关于'查询内并行资源'的一些讨论可以在这里找到。今天的烦人名词:"内查询并行线程"。"查询内并行线程死锁". 虽然大多数讨论都会集中在死锁问题上,但这并不意味着这些资源不能发生普通的阻塞。sys.dm_exec_requests 将有适当的信息在 wait_typewait_resource.


0
投票

我认为其是因为第一个选择正在执行行锁表锁。在加入表的时候可以提供NO LOCK提示。

© www.soinside.com 2019 - 2024. All rights reserved.