linq to sql вставляет замки - PullRequest
1 голос
/ 18 марта 2011

вот код вставки

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

и этот код, таблица блокировок. я могу избежать этого? или это невозможно?

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Пожалуйста, смотрите: LINQ To SQL NO_LOCK .Вам необходимо установить другой уровень изоляции для вашей транзакции.

0 голосов
/ 18 марта 2011

Хотя я не знаю всех подробностей, касающихся вашей проблемы, шаблоны кажутся очень знакомыми. Часто вам нужно выполнить большое обновление в базе данных, но в то же время вам все еще нужно, чтобы база данных была доступна, поэтому, например, если есть веб-сайт, работающий с набором данных, он не прерывается во время обновления Операции в процессе.

Иногда операции обновления могут быть обычным экспортом из другой базы данных, иногда с вычислением некоторых кэшей, в отличие от приведенного вами примера.

Если вам нужно, чтобы ваше обновление было транзакционным (то есть все или ничего), реального способа обойти блокировку нет. Пока идет обновление, таблица заблокирована. Если вам не нужна транзакция, вы можете попытаться разбить обновление на меньшие партии. SubmitChanges, оберните все изменения в одну транзакцию, поэтому вам нужно будет использовать несколько SubmitChanges, чтобы каждая отдельная транзакция была быстрой и, следовательно, не блокировала таблицу на долгое время.

Если требуется транзакционность, вы можете вставлять ее в промежуточную область, т. Е. Не в ту же таблицу, из которой читают другие процессы. Когда вставка закончена, вы выясняете способ, чтобы поменять местами. Это может осложняться тем фактом, что в этой таблице могут быть обновления, которые вы не учли, но я не знаю, так ли это в вашем случае.

В худшем случае вам понадобится некоторая логика приложения, которая будет знать, что обновление выполняется, и пока оно происходит, оно считывает данные из другого места. Конечно, вам придется предоставить это альтернативное местоположение (копию) для чтения.

Трудного и быстрого ответа нет, но есть несколько вещей (выше), которые вы можете попробовать. Также не стесняйтесь рассказать больше о ваших конкретных задач / требований.

...