Estaba insertando dos conjuntos de datos, utilizando un registro mínimo, en una tabla de montón vacía mediante dos tareas Ejecutar SQL que se ejecutan en paralelo y con SQL de la siguiente forma.
INSERT INTO Table (TABLOCK) SELECT FROM ...
Después de que el trabajo se bloquea un poco, una de las tareas de SQL se convirtió en una víctima de punto muerto. A continuación se muestra la salida XML del gráfico de punto muerto.
¿Alguien puede explicar lo que estaba sucediendo debajo del capó?
<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>
Las cosas se ponen mucho más complicadas porque descubrí que, en la mayoría de los casos, las dos tareas Ejecutar SQL pueden ejecutarse en paralelo con éxito. Prueba a continuación:
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
Dado que la única diferencia es la instrucción SELECT ... FROM ..., ¿parece que la instrucción SELECT ... FROM ... puede tener un impacto en el modo de bloqueo aquí?