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?
Jawaban:
The data Memuat Panduan Kinerja ditulis untuk SQL Server 2008 tetapi sejauh yang saya tahu Microsoft belum membuat perbaikan di daerah ini untuk tumpukan. Berikut kutipan untuk skenario pemuatan Anda:
Bagian penting adalah Anda tidak mendapatkan kunci BU
INSERT ... SELECT
. Anda akan selalu mendapatkan kunci eksklusif di atas meja, sehingga hanya satu yangINSERT
dapat berjalan sekaligus.Dalam komentar yang Anda katakan bahwa Anda akan menyisipkan baris 100rb atau kurang dan bahwa proses lain tidak akan berjalan di tabel selama sisipan. Saat mengirim dua pertanyaan INSERT ke database, saya berharap satu dari tiga hal terjadi:
Dalam semua kasus, Anda mendapat manfaat atau tidak terluka dengan menambahkan
TABLOCKX
petunjuk ke kueri, jadi itu adalah rekomendasi saya untuk mengatasi kebuntuan. Jika Anda ingin tahu mengapa kebuntuan kadang terjadi, Anda perlu mencari jawaban lain untuk itu.Karena dalam skenario yang berbeda di mana Anda benar-benar membutuhkan penyisipan paralel, dua cara untuk mengatasi masalah BU adalah mempartisi tumpukan Anda dan menyuruh setiap sesi menyisipkan ke dalam partisi terpisah atau memuat data Anda melalui BCP, BULK INSERT, atau Layanan Integrasi .
sumber
Anda memasukkan ke dalam
dbo.TargetTable
dari dua sesi dan keduanya menggunakanTABLOCK
petunjuk. Keduanyaprocess9609dc8
danprocess5e13048
proses memegangSch-S
danIX
mengunci yang kompatibel satu sama lain sehingga kedua proses dapat bertahan pada waktu yang sama. Tetapi keduanya ingin mengkonversiIX
kunci untukExclusive X
mengetik.X
kunci tidak kompatibel satu sama lain. Oleh karena itu, SQL server memilih salah satu sesi sebagai korban kebuntuan alih-alih menunggu satu sama lain.Informasi kebuntuan dasar.
Bagan Kunci Kompatibilitas (Mesin Basis Data).
Mendeteksi dan Mengakhiri Deadlock.
sumber