2011年02月10日

LINQ to SQL番外編 - 競合時の処理

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQLでは、ChangeConflictException の例外が発生した場合、その競合解決に、
DataContext.ChangeConflictsコレクションのResolveAllメソッドが利用できます。

そのコード例を示します。


ResolveAllメソッドの引数の型であるRefreshModeには、
 KeepChanges、KeepCurrentValues、OverwriteCurrentValues
の3つの値があり、この値によりどのように競合を解決するのかを指定します。

KeepChanges
変更された値と変更前(他のユーザによって変更された)値をマージします。
両方で変更されていた場合は、当該クライアントの変更を優先します。

KeepCurrentValues
他のユーザによって変更された値は無視され、当該クライアントからの変更が有効になります。

OverwriteCurrentValues
当該クライアントによって変更された値は無視され、他ユーザによって変更された値が有効になります。

これを表で表すと以下のようになります。
  カラムA カラムB カラムC
1.User1,USer2が読み込んだ値 aaa bbb ccc
2.User1が更新 sss ttt  
3.User2が更新 xxx   yyy
結果:KeepChanges xxx ttt yyy
結果:KeepCurrentValues xxx bbb yyy
結果:OverwriteCurrentValues sss ttt ccc

※ユーザ2で競合が発生し、ChangeConflicts.ResolveAllで競合解決を図った場合の例

競合の詳細な情報を取得したい場合は、DataContext.ChangeConflictsプロパティを参照します。
以下にそのサンプルコードを示します。



『LINQ to SQL番外編』は、今回を持って終了です。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52120821