2009-07-23 52 views
5

LINQ到SQL:鑑於這種LINQ到SQL併發分辨率

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的一個更新而不是兩個,這可能會有相同的值。

回答

6

可以檢測並解決您的併發問題,通過捕獲ChangeConflictException

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(); 
    } 
} 

隨着RefreshMode .KeepChanges你一定要讓你的客戶對象的所有變化,以及其他用戶對其他領域的變化將是合併。

推薦的文章:

0

這似乎是一個很好的存儲過程的候選人。而不是選擇/更新,創建執行以下一個簡單的存儲過程:

更新後SET LastActivityUtc = GETUTCDATE()其中id = @ ID

傳遞ID存儲過程,並調用它,只要你想更新帖子的最後活動。

+0

使用LINQ to SQL的整點,至少對我來說,就是要避免創建存儲過程。我沒有使用VS的Architect Edition,所以我寧願不打開SQL Management Studio。來吧,叫我懶。 :) – core 2009-07-23 20:45:49