我有问题。我正在尝试使用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 */
}
当我创建一个一切都很好的记录时!
谢谢!
答案 0 :(得分:2)
记录数在3000到10000之间(注释)我会在这里看一个使用SqlBulkCopy将数据推送到临时表的解决方案(即一个看起来类似于你正在操作的数据的表,但不是一部分你的核心模型)。这是将大量数据集提供给服务器的最有效方法(尽管您也可以查看表值参数)。
使用服务器上的数据,我将执行一次更新(内部联接)和一次插入(不存在),或单个“upsert”(在SQL Server 2008及更高版本中可用)。
这在应用程序服务器上使用的CPU较少,网络较少,数据库资源较少。此外,由于插入/更新中只涉及一个SPID,因此不存在死锁的风险。
答案 1 :(得分:0)
我想这可能与我在这个问题Deadlock on SELECT/UPDATE中描述的问题相同。这不是linq到sql的问题。 linq to sql的问题在于你无法使用updlock轻松执行select。