Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C在没有死锁的情况下从多个线程对表执行批量更新_C#_Asp.net_Sql Server_Multithreading_Bulkupdate - Fatal编程技术网

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的代码创建的。你的回答有道理。