none
資料更新的並行衝突控制問題...很頭大!! RRS feed

  • 問題

  • 各位大家好..

    是這樣的...

    先貼程式碼..

    DataStdDataContext dataContext = new DataStdDataContext();
    
      std_Subjects subject=dataContext.std_Subjects.Where(Subjects => Subjects.SubjectId.ToString() == subjectId).First();
    
      subject.UpdateDate = DateTime.Now;
    
      try
    
      {
    
       dataContext.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
    
      }
    
      catch (System.Data.Linq.ChangeConflictException cce) { 
    
        foreach(System.Data.Linq.ObjectChangeConflict occ in dataContext.ChangeConflicts){
    
         occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
    
        }
    
      }
    
    

    並行衝突控制這塊小弟還在研究...!!

    小弟按照微軟給的參考說明進行實作...

    http://msdn.microsoft.com/zh-tw/library/bb399421.aspx

    結果發現...

    subject.UpdateDate = DateTime.Now;

    UpdateDate值依然沒被更新....!!!

    請問這是怎麼回事呢??!!......

    難道我最後只好把該欄位的UpdateCheck設為Never嗎???..0_0..

    望請各位網兄不吝次教....!!

    2010年7月13日 上午 06:36

所有回覆

  • 以我使用LINQ的經驗來看,每次更新Entity前,必須先將該物件查詢出來,再去更新其欄位內容,最後才將更新的結果submit回資料庫,從您的程式碼看來似乎少了查詢欲更新物件的程式碼片段,不曉得您有寫沒貼上來還是漏掉了,可能要請你檢查一下,附上MSDN上更新資料庫中的資料列一文的程式碼片段供您參考。

    // Query the database for the row to be updated.
    var query =
      from ord in db.Orders
      where ord.OrderID == 11000
      select ord;
    
    // Execute the query, and change the column values
    // you want to change.
    foreach (Order ord in query)
    {
      ord.ShipName = "Mariner";
      ord.ShipVia = 2;
      // Insert any additional changes to column values.
    }
    
    // Submit the changes to the database.
    try
    {
      db.SubmitChanges();
    }
    catch (Exception e)
    {
      Console.WriteLine(e);
      // Provide for exceptions.
    }
    

    2010年7月13日 下午 10:41
  •  private void updateUpdateDateInSubject(string subjectId) {
      DataStdDataContext dataContext = new DataStdDataContext();
      std_Subjects subject=dataContext.std_Subjects.Where(Subjects => Subjects.SubjectId.ToString() == subjectId).Single();
      subject.UpdateDate = DateTime.Now;
    
      try
      {
       dataContext.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
      }
      catch (System.Data.Linq.ChangeConflictException cce)
      {
       foreach (System.Data.Linq.ObjectChangeConflict occ in dataContext.ChangeConflicts)
        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
      }  
      
     }
    

    Sorry...只貼一部分..

    上面是一整個Method....

    有傳入subjectId進去...

    利用到IDE工具給LINQ ORM設計工具...

     std_Subjects就是那個table...

    利用Where方法透過Lambda運算式擷取篩選結果..

    有稍微更動一下代碼..

    不過還是行不通...

    還在努力研究看怎麼一回事...

     

    2010年7月14日 上午 03:27
  • 你為什麼那麼確定就是並行衝突? 或許你可以 catch Exception 看看有沒有發生其它的 exceptions。
    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2010年7月14日 上午 06:14
  • 因為抓到的Exception為ChangeConflictException...

     

    2010年7月14日 上午 06:16
  • 您可以參考一下這邊的做法

    HOW TO:管理變更衝突 (LINQ to SQL)

    然後中斷在catch那邊,看看是不是會跑進去catch

    有的話再看一下您的 subject.UpdateDate 是不是等於 DateTime.Now~

    然後再看一下 Exception 的 Message 是啥~

    2010年7月20日 下午 03:16
  • 我試看看...

    2010年7月21日 上午 09:00