ฉันใส่ชุดข้อมูลสองชุดโดยใช้การบันทึกขั้นต่ำลงในตาราง heap ที่ว่างโดยใช้ Execute SQL Tasks สองชุดที่ทำงานแบบขนานและ SQL ในรูปแบบต่อไปนี้
INSERT INTO Table (TABLOCK) SELECT FROM ...
หลังจากงานหยุดทำงานหนึ่งในงาน SQL กลายเป็นเหยื่อการหยุดชะงัก ด้านล่างคือเอาต์พุต XML ของกราฟเดดล็อก
ใครสามารถอธิบายสิ่งที่เกิดขึ้นภายใต้ประทุนได้หรือไม่?
<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>
สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเพราะฉันพบว่าในกรณีส่วนใหญ่งาน Execute SQL สองงานสามารถทำงานแบบขนานได้สำเร็จ ลองด้านล่าง:
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
เนื่องจากความแตกต่างเพียงอย่างเดียวคือคำสั่ง SELECT ... จาก ... ดูเหมือนว่าคำสั่ง SELECT ... จาก ... อาจมีผลต่อโหมดล็อคได้ที่นี่