glöm inte transaktioner. Prestanda är bra, men en enkel (OM FINNS ..) tillvägagångssätt är mycket farlig.
När flera trådar försöker utföra Infoga-eller-uppdatera kan du lätt få primärnyckelöverträdelse.
Lösningar från @Beau Crawford &@Esteban visar generella idéer men felbenägna.
För att undvika dödlägen och PK-kränkningar kan du använda något i stil med detta:
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
eller
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran