C# C在没有死锁的情况下从多个线程对表执行批量更新
我已经编写了以下代码:C# C在没有死锁的情况下从多个线程对表执行批量更新,c#,asp.net,sql-server,multithreading,bulkupdate,C#,Asp.net,Sql Server,Multithreading,Bulkupdate,我已经编写了以下代码: public void BulkUpdateItems(List<Items> items) { var bulk = new BulkOperations(); using (var trans = new TransactionScope()) { using (SqlConnection conn = new SqlConnectio
public void BulkUpdateItems(List<Items> items)
{
var bulk = new BulkOperations();
using (var trans = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(@"connstring"))
{
bulk.Setup()
.ForCollection(items)
.WithTable("Items")
.AddColumn(x => x.QuantitySold)
.BulkUpdate()
.MatchTargetOn(x => x.ItemID)
.Commit(conn);
}
trans.Complete();
}
}
使用SQLBulkTools库。。。但这里的问题是,当我一次从多个线程运行这个过程时,我会在死锁上运行
错误表明某个进程ID被死锁或类似的东西
是否有其他方法可以有效地从多个线程执行1个表的批量更新
有人能帮我吗?试试看
锁
{
....
}
这将做的是,当一个进程在花括号内执行代码时,它将导致其他进程等待第一个进程完成。这样,一次只能有一个进程执行该块。死锁消息来自SQL Server—这意味着您的一个连接正在等待另一个连接锁定的资源,而第二个连接正在等待第一个连接上保留的资源
如果您试图更新同一个表,那么可能会遇到一个简单的SQL锁定问题,而与C无关。您需要更彻底地考虑在多个线程上执行批量更新的含义;这可能取决于您要更新的表的百分比,最好在单个连接上执行此操作,并使用队列样式的机制来消除单个调用之间的冲突。我对该API不太了解,但快速阅读建议您可以尝试几件事。我会按列出的顺序试一下 使用较小的值,和/或将批处理超时设置得更高。这将使每个线程轮流执行 使用一个。这将允许线程独立工作 将设置为使用表锁。如果锁定整个表,不同的线程将无法锁定不同的行,因此不应出现死锁
锁不会同步多个进程,即使同步了,也可以从完全不同的机器与数据库进行交互。同步需要在数据库级别处理。@Servy,我认为该场景是一个进程中的多线程,不是吗?@dsolimano不,不是。这是一个数据库抛出错误,因为与其他数据库连接的某些交互正在导致死锁。数据库不是单个进程的本地数据库。@可能是Servy。但是,如果这是夜间数据加载的一部分,那么在没有其他数据库用户的情况下,这个问题表明了这一点,但没有说明。这一过程完全有可能是自力更生的,我以前也做过。@dsolimano当然,但仅仅因为不太可能有其他人参与,并不意味着你可以认为没有其他人会参与。如果OP执行了您的建议3,那么他/她对多线程的使用是否毫无意义?我猜多线程问题是由OP使用ASP.NET,并且每个HTTP请求有一个线程引起的。但您是正确的,因为它将导致更新以串联方式进行,而不是并行方式进行。使用表锁将允许OP避免编写自己的排队系统代码。另一方面,这些批量操作可能会导致HTTP请求超时。我错过了ASP.Net标记。我认为线程是故意的,是由OP的代码创建的。你的回答有道理。