2011-06-23 9 views
0

レコードの作成は、単純なフローに従います。DBに類似するレコードがないかどうかチェックし、そうでない場合はレコードを作成します。 seriesInstUidは主キーではありません。主キーは、サーバー上のIDプロパティー設定を持つため、SQLサーバーによって作成されます。以下のコードのようにマルチスレッドアプリケーションでLINQ to SQLを使用して重複レコードを作成しないようにするにはどうすればよいですか?

:少数concurentスレッドが矢継ぎ早に同じコードを実行しようとしたときに問題がoccures

  DataClassAsclepiusImagingDataContext db = new DataClassAsclepiusImagingDataContext(); 
      var matchingSeries = from s in db.Series 
           where s.DDSeriesInstanceUID == dd.seriesInsUid 
           select s; 

      if ((matchingSeries == null) || (matchingSeries.Count() < 1)) 
      { 
       Series ser = new Series(); 

       db.GetTable<Series>().InsertOnSubmit(ser); 
       db.SubmitChanges(); 
} 

、レコードが「レコードが存在する場合の間に別の発信者によって作成することができますか? " 「新しいレコードを作成しない場合」を選択します。このような場合、最初の発信者は複製を作成します。

このシナリオで重複が作成されないようにするには、どのような方法が適していますか?

答えて

1

ここにはいくつかの方法があります。 1)データベースに一意の制約を追加して、重複が作成されないようにすることができます。 2)ロックブロック内にデータ挿入コードをカプセル化して、一度に1つのスレッドのみが挿入を実行できるようにします。

+0

#1が役に立つと思われます。ユニークな制約を打ち明けることができますか?私はSQL Server 2005を使用しています。唯一のfiedは一意でなければならず、主キーではありません。ありがとう。 – val

+0

フィールドはプライマリキーである必要はありません。あなたはちょうどそれがユニークになりたい場合は、クエリを実行することにより、独特のcontraintを作成することができますように: ALTER TABLEシリーズ[PRIMARY] ON制約を追加[UN_Series_1] UNIQUE NONCLUSTERED ( \t [DDSeriesInstanceUID] ASC )することはできまた、SQL Server Management Studioから、テーブルを右クリックし、デザインを選択し、列を右クリックし、インデックス/リレーションシップを選択して、一意キーの新しいキーを作成します。 挿入/更新中に追加の検証を行う場合は、トリガを使用できます。http://msdn.microsoft.com/en-us/library/ms189799.aspx – sshah

+0

列の形式はnvarchar [MAX]です。私はそれらをユニークな制約に設定することはできないと思いますか?新しいレコードの作成基準は、すべてのフィールドが同じレコードがない場合にのみ適用されます。何か案は?ありがとう。 – val

関連する問題