2011-03-18 94 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,因此每个单独的事务都很快,因此不会长时间锁定表。

如果是事务性需求,您可以插入暂存区域,即不在与其他进程读取的表相同的表中。插入完成后,您可以找出方法,交换区域。这可能很复杂,因为您可能未更新到此表中,但我不知道您的情况是否属实。

在最糟糕的情况下,您将需要一些应用程序逻辑,即知道更新正在进行中,并且在发生时它会从备用位置读取数据。当然,你将不得不提供这个备用位置(一个副本)来读取。

有没有硬性的答案,但有几件事(上面),你可以尝试。也随时告诉你更多关于你的具体任务/要求。