Sto riscontrando problemi di concorrenza con i miei inserti in una procedura memorizzata. La parte rilevante della procedura è questa:
select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
insert into table1 (othervalue) values (@_othervalue)
select @_id = Id from table1 where othervalue = @_othervalue
END
Quando eseguiamo 3 o 4 di questi processi memorizzati contemporaneamente, riceviamo più inserti in occasione.
Sto programmando di risolvere questo problema in questo modo:
insert into table1 (othervalue)
select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK)
where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )
select @_id = Id from table1 where othervalue = @_othervalue
La domanda è: è come inserire contemporaneamente senza duplicati nel server SQL? Il fatto che devo usare TOP per inserire solo una volta mi disturba.