Saya menyisipkan dua set data, menggunakan penebangan minimal, ke tabel tumpukan kosong menggunakan melalui dua Jalankan Tugas SQL yang berjalan secara paralel dan dengan SQL dari formulir berikut.
INSERT INTO Table (TABLOCK) SELECT FROM ...
Setelah pekerjaan sedikit hang, salah satu tugas SQL menjadi korban kebuntuan. Di bawah ini adalah output XML dari grafik deadlock.
Dapatkah seseorang menjelaskan apa yang terjadi di bawah tenda?
<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>
Banyak hal menjadi lebih rumit karena saya menemukan bahwa untuk sebagian besar kasus, kedua Execute SQL Tasks dapat berjalan secara paralel dengan sukses. Coba di bawah ini:
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
Karena satu-satunya perbedaan adalah pernyataan SELECT ... FROM ..., sepertinya pernyataan SELECT ... FROM ... dapat berdampak pada mode kunci di sini?