【问题标题】:linq to sql insert lockslinq to sql 插入锁
【发布时间】:2011-08-16 22:42:01
【问题描述】:

这是一些插入代码

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();

这个代码,锁表。 我可以避免吗?还是不可能?

【问题讨论】:

  • “锁表”到底是什么意思,为什么这对您来说是个问题? SQL server 锁是一个复杂而广泛的话题,基本上数据库中的大多数操作都需要在操作期间采取某种的锁。如果我们知道您有什么特别关注的问题,我们会更容易回答您。
  • 当时我无法从该表中选择数据
  • datacontext 是否只用于本节?
  • 是的。从其他环境中阅读,甚至从管理工作室中阅读

标签: sql tsql linq-to-sql


【解决方案1】:

虽然我不知道有关您的问题的所有细节,但这些模式似乎非常熟悉。很多时候你需要在数据库中做一个大的更新,但同时你仍然需要数据库可用,所以例如如果有一个网站正在处理数据集,它不会在更新时超时操作正在进行中。

有时更新操作可以是从另一个数据库定期导出,有时会计算一些缓存,与您提供的示例不同。

如果您需要您的更新是事务性的(即全部或全部),则没有真正的解决方法。在更新过程中,该表被锁定。如果您不需要事务,那么您可以尝试将更新拆分为较小的批次。 SubmitChanges,将所有更改包装在一个事务中,因此您需要使用多个 SubmitChanges,因此每个单独的事务都很快,因此不会长时间锁定表。

如果要求事务性,您可以在暂存区域中插入,即不在其他进程读取的同一个表中。插入完成后,您会找出方法来交换区域。这可能会因为您尚未考虑此表的更新而变得复杂,但我不知道您的情况是否属实。

在最坏的情况下,您将需要一些应用程序逻辑,它知道更新正在进行中,并且当它发生时,它会从备用位置读取数据。当然,您必须提供此备用位置(副本)以供读取。

没有硬性和快速的答案,但您可以尝试一些(以上)方法。也请随时详细说明您的具体任务/要求。

【讨论】:

    【解决方案2】:

    请参阅:LINQ To SQL NO_LOCK。您需要为您的事务设置不同的隔离级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多