Używam tego:
begin tran;
update ... where ... ;
if @@rowcount = 0
insert ...
commit tran;
Jak rozumiem, przy odpowiednich indeksach aktualizacja umieszcza odpowiednie blokady zakresu, które uniemożliwiają innym jednoczesne wstawianie tego samego.