C# 使用多个线程更新同一个表中的不同行是否会由于表/页锁定而导致任何死锁或更新延迟?

C# 使用多个线程更新同一个表中的不同行是否会由于表/页锁定而导致任何死锁或更新延迟?,c#,sql-server,multithreading,sql-server-2008,C#,Sql Server,Multithreading,Sql Server 2008,我有一个场景,需要使用SQL Server存储过程更新表中的多行 我使用线程来快速更新(C#控制台应用程序+ADO.NET) 每个线程将更新该表中的不同行集 我很好奇它会不会导致SQL中的死锁 更多详细信息: 我有独立的线程,它们不共享任何公共资源。我更担心SQL锁定机制,因为多个线程调用同一个存储过程来更新同一个表但不同的记录集(不同的行)。它不应该导致任何死锁(只要没有奇怪和复杂的约束) 当您使用像快照这样的重传输隔离时,它可能会导致线程必须互相等待的延迟。但是使用默认的ReadCommit

我有一个场景,需要使用SQL Server存储过程更新表中的多行

我使用线程来快速更新(C#控制台应用程序+ADO.NET)

每个线程将更新该表中的不同行集

我很好奇它会不会导致SQL中的死锁

更多详细信息:


我有独立的线程,它们不共享任何公共资源。我更担心SQL锁定机制,因为多个线程调用同一个存储过程来更新同一个表但不同的记录集(不同的行)。

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


当您使用像快照这样的重传输隔离时,它可能会导致线程必须互相等待的延迟。但是使用默认的ReadCommitted,您应该可以

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


当您使用像快照这样的重传输隔离时,它可能会导致线程必须互相等待的延迟。但是使用默认的ReadCommitted,您应该可以

如果处理不当,线程可能会死锁。 如果你想安全的话。只用

Monitor Class 

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

如果处理不当,线程可能会死锁。 如果你想安全的话。只用

Monitor Class 

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

如果表中没有任何相关索引,您会遇到一些麻烦


除此之外,您应该还可以。

如果表中没有任何相关索引,您将遇到一些麻烦



除此之外,您应该还可以。

您要更新多少条记录?您可以将设置为0以在一批中更新所有。您能给我们看一下SP吗?我正在通过调整存储过程来更新记录。如果您的一个线程一次更新超过5000行,那么将发生锁升级,并且您的行级更新锁将升级为表级更新锁,此时,所有其他线程都必须等待相关线程结束。请澄清:如果所有线程一起一次更新超过5000行,则会发生锁升级,一个线程将获得表级更新锁,并锁定所有其他线程,使其无法进行进一步更新。只要线程不更新相同的行,这就不会导致死锁,但可能会导致某些更新超时并回滚。如果多个线程更新的记录不超过5000条,那么编写多线程应用程序是一个好主意。。。如果我是对的,让我知道。请注意:我正在使用多线程尽可能快地更新记录。您正在更新多少记录?您可以将设置为0以在一批中更新所有。您能给我们看一下SP吗?我正在通过调整存储过程来更新记录。如果您的一个线程一次更新超过5000行,那么将发生锁升级,并且您的行级更新锁将升级为表级更新锁,此时,所有其他线程都必须等待相关线程结束。请澄清:如果所有线程一起一次更新超过5000行,则会发生锁升级,一个线程将获得表级更新锁,并锁定所有其他线程,使其无法进行进一步更新。只要线程不更新相同的行,这就不会导致死锁,但可能会导致某些更新超时并回滚。如果多个线程更新的记录不超过5000条,那么编写多线程应用程序是一个好主意。。。如果我是对的,让我知道。请注意:我正在使用多线程尽可能快地更新记录。我有独立的线程,它们不共享任何公共资源。我更担心的是SQL锁定机制,因为多个线程调用同一个存储过程来更新同一个表但不同的记录集!如果您更新的行数超过5000行,那么您将获得一个表级锁,并且所有其他线程都将被阻塞@KishoreJangid-你能解释一下为什么它不会导致死锁吗?@ParagM-你认为死锁是什么?我有独立的线程,它们不共享任何公共资源。我更担心的是SQL锁定机制,因为多个线程调用同一个存储过程来更新同一个表但不同的记录集!如果您更新的行数超过5000行,那么您将获得一个表级锁,并且所有其他线程都将被阻塞@KishoreJangid-你能给我解释一下为什么它不会导致死锁吗?@ParagM-你认为死锁是什么?当超过5000行被更新时,锁升级(从行级到表级)如何?@marc_s:不熟悉,但它会处于“重发送模式”下,ie延迟,但没有死锁。正确-延迟,可能超时-但没有死锁。好的。现在据我所知,它不会导致任何死锁,但进程将延迟,因为一个线程将锁定表。那么,我想没有必要为此制作多线程应用程序。如果我的假设是错误的,请告诉我。不,线程通常不会锁定整个表。你离那5000排有多近(每次9排)?通常情况下,几个线程是有益的。当超过5000行被更新时,锁升级(从行级到表级)如何?@marc_s:不熟悉,但它会处于“重发送模式”,即延迟但没有死锁。正确-延迟,可能超时-但没有死锁。好的。现在,据我所知,这不会造成任何死锁,但进程会随着时间的推移而延迟