LinqToSql。更新行时出现死锁。的Parallel.For

时间:2011-12-26 08:22:13

标签: c# database linq-to-sql parallel-processing

我有问题。我正在尝试使用parallel更新数据库库。这是代码:

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 个答案:

答案 0 :(得分:2)

记录数在3000到10000之间(注释)我会在这里看一个使用SqlBulkCopy将数据推送到临时表的解决方案(即一个看起来类似于你正在操作的数据的表,但不是一部分你的核心模型)。这是将大量数据集提供给服务器的最有效方法(尽管您也可以查看表值参数)。

使用服务器上的数据,我将执行一次更新(内部联接)和一次插入(不存在),或单个“upsert”(在SQL Server 2008及更高版本中可用)。

这在应用程序服务器上使用的CPU较少,网络较少,数据库资源较少。此外,由于插入/更新中只涉及一个SPID,因此不存在死锁的风险。

答案 1 :(得分:0)

我想这可能与我在这个问题Deadlock on SELECT/UPDATE中描述的问题相同。这不是linq到sql的问题。 linq to sql的问题在于你无法使用updlock轻松执行select。