Io uso questo:
begin tran;
update ... where ... ;
if @@rowcount = 0
insert ...
commit tran;
A quanto ho capito, con gli indici appropriati in atto, l'aggiornamento inserisce i blocchi di intervallo appropriati che impedirebbero ad altri di inserire la stessa cosa contemporaneamente.