2011-03-18 81 views
1

是一些插入代碼的LINQ to SQL插入鎖定

gkInfo.data.ToList() 
      .ForEach(p => p.hour.ToList() 
       .ForEach(r => r.block.ToList() 
         .ForEach(q => 
         { 
          var v = new VarValues(); 
          v.dt = DateTime.Parse(p.target_date + " " + (r.value - 1).ToString() + ":00:00"); 
          v.id_objecttype = config.stations.Where(i => i.text == q.station_name).Single().id_objecttype; 
          v.id_object = q.bnum.ToString(); 
          v.id_param = config.stations.Where(i => i.text == q.station_name).Single().id_param; 
          v.pl_lev = 3; 
          v.source = 0; 
          v.value = q.block_state; 
          v.version = version; 
          v.description = q.change_type; 
          m53500context1.VarValues.InsertOnSubmit(v); 
         } 

     ))); 


      m53500context1.SubmitChanges(); 

和驗證碼,鎖表。 我可以避免嗎?或者它不可能?

+0

你是什麼意思的「鎖表」,爲什麼這是你的問題? SQL服務器鎖是複雜而廣泛的話題,基本上數據庫中的大部分操作都需要在操作期間採取某種形式的鎖。如果我們知道你特別關心的是什麼,那將會更容易回答你。 – 2011-03-18 07:53:35

+0

我無法在該時刻從此表中選擇數據 – 2011-03-18 08:00:43

+0

datacontext是否僅用於本節? – 2011-03-18 08:10:11

回答

0

雖然我不知道關於您的問題的所有細節,但模式似乎非常熟悉。通常情況下,您需要在數據庫中進行大量更新,但同時您仍然需要數據庫可用,例如,如果存在正在處理數據集的網站,則在更新時不會超時正在進行的操作。

有時更新操作可以從另一個數據庫定期導出,有時計算一些緩存,與您提供的示例不同。

如果你需要你的更新是事務性的(即全部或全部),那麼鎖定周圍沒有真正的方法。當更新正在進行時,表被鎖定。如果你不需要交易,那麼你可以嘗試並分解你更新到較小的批次。 SubmitChanges,將所有更改包裝在單個事務中,因此您需要使用多個SubmitChanges,因此每個單獨的事務都很快,因此不會長時間鎖定表。

如果是事務性需求,您可以插入暫存區域,即不在與其他進程讀取的表相同的表中。插入完成後,您可以找出方法,交換區域。這可能很複雜,因爲您可能未更新到此表中,但我不知道您的情況是否屬實。

在最糟糕的情況下,您將需要一些應用程序邏輯,即知道更新正在進行中,並且在發生時它會從備用位置讀取數據。當然,你將不得不提供這個備用位置(一個副本)來讀取。

有沒有硬性的答案,但有幾件事(上面),你可以嘗試。也隨時告訴你更多關於你的具體任務/要求。