ストアドプロシージャへの挿入で並行性の問題が発生しています。手順の関連部分は次のとおりです。
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
これらのストアドプロシージャを3つまたは4つ同時に実行すると、複数の挿入が発生することがあります。
私はこれを次のように修正することを計画しています:
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
問題は、SQLサーバーに重複せずに同時に挿入する方法ですか?私は一度だけ挿入するためにTOPを使用しなければならないという事実は私を混乱させます。
1
TOPを使用する必要はありません。SELECTステートメントからFROMテーブル参照を削除します。
—
エリック
@GSergあなたは正しいと思います。
—
クリス