2009-07-23 51 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