【发布时间】:2012-03-19 13:42:26
【问题描述】:
我有一个场景,我必须使用 SQL Server 存储过程更新表中的多行。
我正在使用线程来快速更新(C# 控制台应用程序 + ADO.NET)。
每个线程都会更新该表中的不同行集。
我很好奇它会导致 SQL 中的任何死锁吗?
更多详情:
我有独立的线程,它们不共享任何公共资源。我更担心 SQL 锁定机制,因为多个线程正在调用相同的 Stored Proc 来更新同一张表但不同的记录集(不同的行)。
【问题讨论】:
-
您要更新多少条记录?您可以将 DataAdapter's UpdateBatchSize 设置为 0 以批量更新所有内容。你能告诉我们SP吗?
-
我正在通过调用存储过程来更新记录。
-
如果您的一个线程一次更新超过 5,000 行,那么 lock escalation 将发生并且您的行级更新锁将升级到 table -level 更新锁,此时所有其他线程都必须等到相关线程结束。
-
澄清一下:如果所有线程一起一次更新超过 5000 行,则会发生锁升级,一个线程将获得表级更新锁并锁定所有其他线程进行进一步更新。只要线程不更新相同的行,这不会导致死锁,但可能会导致某些更新超时并回滚。
-
我想确认的最后一件事。如果多个线程没有更新超过 5000 条记录,那么编写一个多线程应用程序是个好主意……如果我是正确的,请告诉我。请注意:我正在使用多线程来尽快更新记录。
标签: c# sql-server multithreading sql-server-2008