J'insérais deux ensembles de données, en utilisant une journalisation minimale, dans une table de tas vide à l'aide de deux tâches d'exécution SQL exécutées en parallèle et avec SQL de la forme suivante.
INSERT INTO Table (TABLOCK) SELECT FROM ...
Une fois le travail bloqué, l'une des tâches SQL est devenue une victime de blocage. Ci-dessous, la sortie XML du graphique de blocage.
Quelqu'un peut-il expliquer ce qui se passait sous le capot?
<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>
Les choses deviennent beaucoup plus délicates car j'ai trouvé que dans la plupart des cas, les deux tâches d'exécution SQL peuvent s'exécuter en parallèle avec succès. Essayez ci-dessous:
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
Étant donné que la seule différence est l'instruction SELECT ... FROM ..., ressemble à l'instruction SELECT ... FROM ... peut avoir un impact sur le mode de verrouillage ici?