代码之家  ›  专栏  ›  技术社区  ›  core

Linq to SQL:并发解析

  •  5
  • core  · 技术社区  · 15 年前

    给定此linq to 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的更新,而不是同时提交这两个更新,这两个更新的值可能都相同。

    2 回复  |  直到 15 年前
        1
  •  6
  •   Christian C. Salvadó    15 年前

    通过捕获 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 .keep changes您将保留客户端对象的所有更改,并且来自其他域上其他用户的更改将被合并。

    推荐文章:

        2
  •  0
  •   Randolpho    15 年前

    这似乎是存储过程的一个很好的候选者。创建执行以下操作的简单存储过程,而不是选择/更新:

    更新post set lastactivityutc=getutcdate(),其中id=@id

    将ID传递给存储过程,并在希望更新日志的最后一个活动时调用它。