đừng quên về các giao dịch. Hiệu suất là tốt, nhưng cách tiếp cận đơn giản (NẾU TỒN TẠI ..) rất nguy hiểm.
Khi nhiều luồng cố gắng thực hiện Chèn hoặc cập nhật, bạn có thể dễ dàng bỏ qua vi phạm khóa chính.
Các giải pháp do @Beau Crawford &@Esteban cung cấp cho thấy ý tưởng chung nhưng dễ xảy ra lỗi.
Để tránh tình trạng bế tắc và vi phạm PK, bạn có thể sử dụng một cái gì đó như sau:
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
hoặc
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran