Stavo inserendo due set di dati, utilizzando la registrazione minima, in una tabella heap vuota utilizzando due attività Esegui SQL in esecuzione in parallelo e con SQL del seguente modulo.
INSERT INTO Table (TABLOCK) SELECT FROM ...
Dopo che il processo si è bloccato un po ', una delle attività SQL è diventata una vittima del deadlock. Di seguito è riportato l'output XML del grafico deadlock.
Qualcuno può spiegare cosa stava succedendo sotto il cofano?
<resource-list>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process9609dc8" mode="Sch-S"/>
<owner id="process9609dc8" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process5e13048" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
<owner-list>
<owner id="process5e13048" mode="Sch-S"/>
<owner id="process5e13048" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process9609dc8" mode="X" requestType="convert"/>
</waiter-list>
</objectlock>
</resource-list>
Le cose diventano molto più complicate perché ho scoperto che nella maggior parte dei casi le due attività Esegui SQL possono essere eseguite in parallelo con successo. Prova di seguito:
Create table dbo.TablockInsert (c1 int, c2 int, c3 int)
--then issue the script in two Execute Sql Task in parallel you won't fail:
insert into dbo.TablockInsert(TABLOCK) SELECT 1, 1, 1
Poiché l'unica differenza è l'istruzione SELECT ... FROM ..., sembra che l'istruzione SELECT ... FROM ... possa avere un impatto sulla modalità di blocco qui?