2009-07-23 6 views
5

LINQ:SQLにこのLINQを考えると並行処理解像度

using (var db = Database.Context) 
{ 
    var root = (from post in db.Post 
       where post.Id == rootPostId 
       select post).Single(); 

    root.LastActivityUtc = DateTime.UtcNow; 

    db.SubmitChanges(); 
} 

同じレコードが同時に同じrootPostIdで(このコードは住んでいる)同じメソッドへの別の呼び出しによって変更されている場合はどうなりますか?例外がスローされますか?

このようなイベントでは、並行性の競合が発生しました。変更を単純に破棄して、LastActivityUtcへの更新が1つだけ送信されるようにしたいと思います。両方ともではなく、おそらく同じ値になります。

答えて

6

あなたが検出し、ChangeConflictException引くことで、あなたの並行性の問題を解決することができます:あなたはあなたのクライアントオブジェクトのすべての変更、および他のフィールド上の他のユーザーからの変更を維持しますRefreshMode .KeepChangesで

using (var db = new MyDataContext()) 
{ 
    var root = (from post in db.Post 
       where post.Id == rootPostId 
       select post).Single(); 

    root.LastActivityUtc = DateTime.UtcNow; 

    try 
    { 
     db.SubmitChanges(); 
    } 
    catch (ChangeConflictException) 
    { 
     db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges); 
     db.SubmitChanges(); 
    } 
} 

がされます合併した

お勧めの記事:

0

これはストアドプロシージャの候補のようです。むしろより/更新を選択し、以下を実行し、簡単なストアドプロシージャを作成:ID = @ IDを

は、ストアドプロシージャにIDを渡すと、あなたはいつでもそれを呼び出す

UPDATEポストSETをLastActivityUtc = GETUTCDATE()投稿の最後のアクティビティを更新します。

+0

SQLにLINQを使用しての全体のポイントは、少なくとも私にとっては、ストアドプロシージャを作成することを避けるためであります。私はVSのArchitect Editionを使用していないので、SQL Management Studioを開かないでください。先に、私を怠惰に呼んでください。 :) – core

+2

あなたは怠け者です。 私はストアドプロシージャの大ファンでもありませんが、彼らはその場所を持っています。このようなクイックチェンジは、まさに彼らにとって良いものです。ジョブには適切なツールを使用します。 LINQ to SQLは非常に大きなハンマーです。すべてが爪ではありません。 – Randolpho

関連する問題