【问题标题】:Will updating different rows from same table using multiple threads cause any deadlocks or delay in updates due to table/page locks?使用多个线程从同一个表更新不同的行会导致由于表/页锁而导致的任何死锁或更新延迟吗?
【发布时间】: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


【解决方案1】:

它不应该导致任何死锁(只要没有奇怪和复杂的约束)。

当您使用像快照这样的重型 TransIsolation 时,可能会导致线程必须相互等待的延迟。但是使用默认的 ReadCommitted 你应该没问题。

【讨论】:

  • 当超过 5'000 行被更新时,锁升级(从行级到表级)怎么样??
  • @marc_s : 不熟悉,但它属于“Heavy Tx 模式”,即延迟但没有死锁。
  • 正确 - 延迟和可能超时 - 但没有死锁。
  • 好的。现在据我了解,它不会导致任何死锁,但进程会延迟,因为一个线程将锁定表。然后我想没有必要为此制作多线程应用程序。如果我的假设是错误的,请告诉我。
  • 不,线程通常不会锁定整个表。每次 9 行 5.000 行你有多接近)?通常几个线程将是有益的。
【解决方案2】:

如果您不正确处理线程,线程可能会陷入僵局。 如果你想安全。只需使用

Monitor Class 

这将限制并锁定您当前的线程。

【讨论】:

  • 我有独立的线程,它们不共享任何公共资源。我更担心 SQL 锁定机制,因为多个线程正在调用同一个 Stored Proc 来更新同一张表但不同的记录集。
  • 那就不用担心锁了
  • 哦,您应该担心锁!如果您更新超过 5000 行,那么您将获得 表级锁 和所有其他线程将被阻塞。 .....
  • @KishoreJangid - 你能给我解释一下为什么它不会导致任何死锁吗?
  • @ParagM - 你认为死锁是什么?
【解决方案3】:

如果您的表上没有任何相关索引,您就会遇到麻烦。

除此之外你应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2020-08-29
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多