Я не эксперт по взаимоблокировкам, но то, что я вижу, не совсем понятно мне. Похоже, что два разных процесса блокируются на одном и том же объекте. Разве один процесс не будет просто ждать освобождения ресурса и продолжать свою жизнь? Обычно при блокировке задействованы 2 ресурса, поэтому я запутался.
Тупик:
<deadlock-list>
<deadlock victim="process53f288">
<process-list>
<process id="process53f288" taskpriority="0" logused="264" waitresource="KEY: 7:72057594065977344 (651c594e0a33)" waittime="4406" ownerId="293044707" transactionname="user_transaction" lasttranstarted="2013-10-03T15:41:21.040" XDES="0x80cd53c0" lockMode="X" schedulerid="1" kpid="14284" status="suspended" spid="92" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-10-03T15:41:21.560" lastbatchcompleted="2013-10-03T15:41:21.553" clientapp=".Net SqlClient Data Provider" hostname="MCCMTLMCS001" hostpid="2952" loginname="asapdb" isolationlevel="read committed (2)" xactid="293044707" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="34" sqlhandle="0x0200000065487b054151f9a8d40f9f90d40cba7ff11e6228">
UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1 </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@p0 int,@p1 int)UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1 </inputbuf>
</process>
<process id="process7ed948" taskpriority="0" logused="4556" waitresource="KEY: 7:72057594065977344 (62b5bdcd3e80)" waittime="4403" ownerId="293044717" transactionname="user_transaction" lasttranstarted="2013-10-03T15:41:21.050" XDES="0x1298df950" lockMode="X" schedulerid="4" kpid="7344" status="suspended" spid="94" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-10-03T15:41:21.560" lastbatchcompleted="2013-10-03T15:41:21.557" clientapp=".Net SqlClient Data Provider" hostname="MCCMTLMCS001" hostpid="2952" loginname="asapdb" isolationlevel="read committed (2)" xactid="293044717" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="34" sqlhandle="0x0200000065487b054151f9a8d40f9f90d40cba7ff11e6228">
UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1 </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@p0 int,@p1 int)UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1 </inputbuf>
</process>
</process-list>
<resource-list>
<keylock hobtid="72057594065977344" dbid="7" objectname="ExactaDB.dbo.InnoPickCaseList" indexname="PK_InnoPickCaseList" id="locka7110b00" mode="X" associatedObjectId="72057594065977344">
<owner-list>
<owner id="process7ed948" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process53f288" mode="X" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594065977344" dbid="7" objectname="ExactaDB.dbo.InnoPickCaseList" indexname="PK_InnoPickCaseList" id="lockbb807a80" mode="X" associatedObjectId="72057594065977344">
<owner-list>
<owner id="process53f288" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process7ed948" mode="X" requestType="wait"/>
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>
График
Дополнительные детали
- InnoPickCaseList.Sequence является первичным ключом в таблице и имеет кластеризованный индекс.
- Таблица обычно содержит около 10 тыс. записей.
Я думаю, что проблема возникает из-за того, как конкретное приложение выполняет свои обновления. По сути, есть два разных потока, которые могут обновлять один и тот же набор данных (диапазон номеров InnoPickCaseList.Sequence) внутри транзакции, но обновления могут выполняться в другом порядке. На данный момент я внес изменение, чтобы упорядочить данные одинаковым образом в двух разных потоках, чтобы обновления происходили в одной и той же последовательности.