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

我有个问题。 我正在尝试使用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 */ } 

这是要更新的function代码字段:

 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 */ } 

当我创建一个一切都很好的记录!

谢谢!

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

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

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

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