Как один SELECT блокирует другой? - PullRequest
2 голосов
/ 08 июня 2010

Я смотрю на вывод SP_WhoIsActive на SQL Server 2005, и он говорит мне, что один сеанс блокирует другой - хорошо.Однако они оба работают на SELECT.Как один SELECT блокирует другой?Разве они оба не должны получать общие блокировки (которые совместимы друг с другом)?

Еще несколько подробностей: ни у одного сеанса нет открытого счета транзакций - поэтому они автономны.

запросы объединяют представление с таблицей.

Это сложные запросы, объединяющие множество таблиц и приводящие к примерно 10 000 чтений.

Любое понимание высоко ценится.

Ответы [ 2 ]

4 голосов
/ 08 июня 2010

Операторы 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_type и wait_resource.

0 голосов
/ 08 июня 2010

Я думаю, это потому, что первый выбор выполняет блокировку строки / таблицы. При присоединении к таблице вы можете указать подсказку NO LOCK.

...