🔥 Selamat datang di BOLABARENG — Jelajahi tren terbaru tentang olah-bet-togel!
Penyebab Deadlock pada MERGE dengan SERIALIZABLE
Saya kadang-kadang mendapatkan kesalahan "Transaction (Process ID X) was deadlocked on lock" saat menjalankan pernyataan MERGE berikut dalam prosedur tersimpan dan saya tidak mengerti mengapa:
SET XACT_ABORT ON BEGIN TRANSACTION MERGE [Product] WITH (SERIALIZABLE) AS TARGET USING ( SELECT DISTINCT Id, Name FROM @Products ) AS SOURCE ON (TARGET = SOURCE) WHEN MATCHED THEN UPDATE SET TARGET = SOURCE WHEN NOT MATCHED BY TARGET THEN INSERT (Id, Name) VALUES (Id, Name); MERGE [Item] WITH (SERIALIZABLE) AS TARGET USING ( SELECT DISTINCT i, itId, i FROM @Items i JOIN [Product] p ON itId = p ) AS SOURCE ON (TARGETtId = SOURCEtId AND TARGET = SOURCE) WHEN NOT MATCHED BY TARGET THEN INSERT (ProductId, Qty) VALUES (SOURCEtId, SOURCE); COMMIT TRANSACTION
@Products dan @Items adalah parameter bernilai tabel. Apa yang menyebabkan deadlock? Apakah karena JOIN ke tabel [Product]? Mengapa objek yang muncul adalah [Item] dalam laporan xml_deadlock?
Kedua proses meminta kunci eksklusif pada partisi tabel Item. Deadlock tidak terjadi pada variabel tabel. Apakah Anda benar-benar perlu menggunakan tingkat isolasi serializable?
Analisis dari Komunitas
Hint SERIALIZABLE menyebabkan level kunci yang lebih tinggi dan membuatnya bertahan lebih lama. Disarankan menggunakan INSERT sebagai pengganti MERGE pada pernyataan kedua. Untuk menangani duplikat, gunakan WHERE NOT EXISTS seperti:
INSERT INTO Item ( ProductId, Qty ) SELECT SOURCEtId, SOURCE FROM ( SELECT DISTINCT itId, i FROM @Items i JOIN [Product] p ON itId = p ) AS SOURCE WHERE NOT EXISTS(SELECT 1 FROM Item i WHERE itId = SOURCEtId AND i = SOURCE)
Selain itu, gunakan UPDATE diikuti INSERT untuk tabel pertama guna menghindari masalah kinerja MERGE. Contoh:
UPDATE Target SET Target = p FROM [Product] Target INNER JOIN @Products p ON p = Target AND p <> Target INSERT INTO [Product](Id, Name) SELECT Id, Name FROM @Products p WHERE NOT EXISTS(SELECT * FROM [Product] Target WHERE Target = p)
Hindari DISTINCT dalam SELECT dari variabel tabel; buat variabel tabel dengan nilai unik sejak awal. Buat primary key atau indeks pada kolom Id variabel tabel untuk kinerja lebih baik.
SERIALIZABLE menyebabkan kunci lebih ketat dan waktu penahanan lebih lama, sehingga memicu deadlock. Deadlock terjadi karena kedua sesi saling menunggu kunci eksklusif pada objek yang sama. Gunakan tingkat isolasi lebih rendah atau ganti MERGE dengan INSERT/UPDATE untuk mengurangi risiko.
Kasino
Olahraga
slot-bet-40-rupiah