Я пытаюсь определить причину тупика с помощью SQL Server Profiler. Вот график взаимоблокировок: Оба оператора являются вставками, за которыми следует
select scope_identity();
Фактически имеют 2 параллельных процесса, которые многократно выполняют insert-select_identity за один цикл.
Я ожидал, что insert принимает исключительную блокировку для кластеризованного индекса, а select принимает общую блокировку некластеризованного индекса , а затем ждут, пока друг друга освободят свои индексы.
Я вижу, что оба процесса ждут освобождения одного и того же ресурса - кластеризованного индекса. Как это может быть? Конкретное обращение должно принадлежать либо одному процессу, либо другому. Что мне здесь не хватает? заранее всем спасибо.
Отредактировано: да, уровень изоляции - Serializible. PS: вероятно, мое предположение об общей блокировке некластеризованного индекса было неверным, поскольку мой выбор не содержит оператора where
Edit2: вот часть xml:
<resource-list>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process8e09288" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process991ce08" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process991ce08" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process8e09288" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
</resource-list>
В соответствии с этим, я думаю, что это сканирование диапазона, вызванное последовательной изоляцией (погуглил). Но все же я не понимаю, как это происходит и какое средство рекомендуется использовать.