jangan lupa tentang transaksi. Performanya bagus, tetapi pendekatan sederhana (JIKA ADA..) sangat berbahaya.
Ketika beberapa utas mencoba melakukan Sisipkan-atau-perbarui, Anda dapat dengan mudah mendapatkan pelanggaran kunci utama.
Solusi yang diberikan oleh @Beau Crawford &@Esteban menunjukkan ide umum tetapi rawan kesalahan.
Untuk menghindari kebuntuan dan pelanggaran PK Anda dapat menggunakan sesuatu seperti ini:
begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
update table set ...
where key = @key
end
else
begin
insert into table (key, ...)
values (@key, ...)
end
commit tran
atau
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran