Kri*_*rip 3 t-sql sql-server concurrency blocking
我正在查看SQL Server 2005 上SP_WhoIsActive的输出,它告诉我一个会话阻止了另一个会话-很好。但是,它们都在运行SELECT。一个SELECT如何阻止另一个?他们俩不应该都获得共享锁(彼此兼容)吗?
更多详细信息:这两个会话都没有开放的事务计数-因此它们是独立的。
查询将视图与表连接在一起。
它们是复杂的查询,它们连接许多表并导致10,000次左右的读取。
任何见解非常感谢。
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>
Run Code Online (Sandbox Code Playgroud)
这不是锁,是“ e_waitPipeGetRow”资源,由SELECT拥有,另一个SELECT正在等待它。在此处可以找到有关“查询内并行资源”的一些讨论:今天的烦人且笨拙的术语:“查询内并行线程死锁”。尽管大多数讨论将集中讨论死锁问题,但这并不意味着在这些资源上不会发生普通阻塞。sys.dm_exec_requests将在wait_type和中具有正确的信息wait_resource。