vergeet transacties niet. Prestaties zijn goed, maar een eenvoudige (INDIEN BESTAAN..) benadering is erg gevaarlijk.
Als meerdere threads zullen proberen om Insert-of-update uit te voeren, kunt u gemakkelijk een schending van de primaire sleutel krijgen.
Oplossingen van @Beau Crawford &@Esteban tonen een algemeen idee, maar zijn foutgevoelig.
Om impasses en PK-overtredingen te voorkomen, kunt u zoiets als dit gebruiken:
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
of
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran