残念ながら、上記の答えはどれも正しくありません。開始する「ロック」ソリューションに注意してくださいBEGIN TRAN SELECT
。はい、分離レベルが SERIALIZABLE の場合、SELECT
他のプロセスが選択したデータを更新できないようにするロックを作成します。しかし、データが選択されていない場合はどうなるでしょうか? 何をロックしますか?
IOW、BEGIN TRAN
競合状態を設定します。
/* spid */
/* 1 */ SELECT ... -- returns no rows
/* 2 */ SELECT ... -- returns no rows
/* 1 */ INSERT ... -- whew!
/* 2 */ INSERT ... -- error
書き込む前に読み取る (たとえば、ユーザーにデータを表示する) には、特別なタイムスタンプ データ型があります。ただし、あなたの場合、それは単なる挿入です。アトミック トランザクション、つまり単一のステートメントを使用します。
insert into [ua_subset_composite] (column1, column2)
values ('sadsadsad', 1)
where not exists (
select 1 from ua_subset_composite
where column1 = 'sadsadsad'
)
サーバーは、行が挿入されるかどうかを保証します。ロックは、方法を知っている人によって、可能な限り短時間で、必要な場所で行われます。:-)
一意制約を追加したくない
まあ、おそらくそうすべきでしょう。上記のコードは、一意でない値を追加しようとするのを防ぎ、エラー メッセージを回避します。一意の制約は、注意を怠った人が成功するのを防ぎます。