Bagaimana dengan pola "JFDI"?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Serius, ini tercepat dan paling bersamaan tanpa kunci, terutama pada volume tinggi. Bagaimana jika UPDLOCK dieskalasi dan seluruh tabel terkunci?
Baca pelajaran 4:
Pelajaran 4: Saat mengembangkan proc upsert sebelum menyetel indeks, pertama-tama saya percaya bahwa
If Exists(Select…)
baris akan menyala untuk item apa pun dan akan melarang duplikat. Nada. Dalam waktu singkat ada ribuan duplikat karena item yang sama akan mencapai upsert pada milidetik yang sama dan kedua transaksi akan melihat tidak ada dan melakukan penyisipan. Setelah banyak pengujian, solusinya adalah menggunakan indeks unik, menangkap kesalahan, dan mencoba lagi mengizinkan transaksi untuk melihat baris dan melakukan pembaruan, bukan menyisipkan.