同じ環境では、同じSQL Serverテーブルに2つの重複した挿入を避ける必要があります。これを行うためにSQL Serverと重複した挿入防止
、すべての最初の、私はSELECT
を実行しよう:たとえば
WITH (UPDLOCK, ROWLOCK)
:その直後
SELECT *
FROM Products p WITH (UPDLOCK, ROWLOCK)
WHERE p.groupId = ?1 AND p.classId = ?2
上記の選択がで0レコードを返す場合同じ取引私はINSERT
ステートメントを行います。
このアプローチでは、同じ製品の空のテーブルに重複が防止されますか?p.groupId = ?1 AND p.classId = ?2
?
いいえ、重複を避けるためにどのように実装する必要がありますか?
UNIQUEインデックスを作成します。 – NEER
'groupIdと' classId' *の組み合わせが一意でなければならない場合、それらはあなたのプライマリキーであるか、またはユニークな制約が適用されている必要があります。この保護を「保証する」他の方法もありますが、フィールド/テーブルに適切な制約を適用することが最善の方法です。 – alroc
あなたの答えをありがとう。私は間違っているかもしれませんが、私はこのアプローチの潜在的な問題を1つ見ています(私を修正してください) - 既存のデータ(これらのgroupIdとclassIdを持つ)の場合に2番目のトランザクションは失敗しますが、新しいレコード - それらを更新するために既存のレコードを使用します。これは、私が2番目のトランザクションが最初のトランザクション完了を待つことを望んでいる理由です。これが私がMS SQL Serverのロック機構を探している理由です。 – alexanoid