LinqToSql. Тупик при обновлении строки. Parallel.For - PullRequest
2 голосов
/ 26 декабря 2011

У меня проблема. Я пытаюсь обновить базу данных, используя параллель. Вот код:

Parallel.For(rCnt, range.Rows.Count + 1, (jrCnt, loopState) =>
{
    var prcI = new Price(); // new 

    /*bla bla bla bla - bla bla - bla bla - bla */

    if ((!string.IsNullOrEmpty(prcI.name)) && (prcI.prc != 0)) // process add or update
    {
        prcI.company = nameprice;
        prcI.date = datatimeselect.Text; 

        Accessor.AddProductUpdateProduct(prcI); // main func

            /*bla bla bla bla - bla bla - bla bla - bla bla - bla  */
    }

Вот поле кода функции для обновления:

public static bool AddProductUpdateProduct(Price price)
    {
        bool add = false;
        var db = new PriceDataContext();

        var matchedprod =
           db.Price.Single(x => x.name == price.name && x.date != price.date && x.company == price.company); // find match

        if (matchedprod != null) // match FOUnDE
        {
            if (matchedprod.prc != price.prc)
            {
                matchedprod.date = price.date;
                matchedprod.prc = price.prc;
            }
            else
            {
                matchedprod.date = price.date;
            }
            db.SubmitChanges(); // DEADLOCK is her!!!
        }
        /*bla - bla bla - bla bla - bla bla - bla bla - bla */
    }

Когда я создаю запись, все хорошо!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

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

При наличии данных на сервере я бы сделал одно обновление (внутреннее).join) и одна вставка (там, где она не существует) или одна «upsert» (доступна в SQL Server 2008 и более поздних версиях).

При этом используется меньше ЦП на сервере приложений, меньше сети и меньше ресурсов базы данных.,Кроме того, поскольку во вставке / обновлении задействован только один SPID, риск взаимоблокировки отсутствует.

0 голосов
/ 26 декабря 2011

Я думаю, это может быть та же проблема, которую я описал в этом вопросе Тупик при SELECT / UPDATE .Это не проблема с linq to sql.Проблема с linq to sql в том, что вы не можете легко выполнить выбор с помощью Updlock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...