【问题标题】:Simultaneous DML operations on same table based on different where clause基于不同的where子句对同一张表同时进行DML操作
【发布时间】:2015-06-11 06:45:34
【问题描述】:

是否可以在 SQl Server 中同时运行 3 个作业(比如凌晨 3:00)来更新同一个表?更新有不同的 where 子句。我想知道这些表会死锁还是每个作业将彼此独立运行。此外,当更新运行时,它是否会锁定整个表?

【问题讨论】:

  • 为所有表添加 WITH NOLOCK
  • @mohan111 - 不知道任何上下文的残暴建议。
  • 当在同一张表上完成事务以避免锁定时,我只是建议他添加 NOLOCKS 它不会解决但需要遵循 Process @Damien_The_Unbeliever
  • 您的问题过于宽泛,无法给出准确的答案。在不知道您的查询是什么、表结构是什么、更新过程中涉及的数据/行、索引等的情况下,很难为您的场景提供完整准确的答案。这将帮助您了解concept
  • 被更新的列没有索引但是where子句中的列有索引@ughai

标签: sql-server locking dml


【解决方案1】:

如果您要更新不同的行,则可以同时更新同一个表,但至少在以下情况下可能会发生死锁或至少阻塞:

  1. 您没有用于 where 子句的索引,因此更新可能会相互阻塞,因为需要扫描整个聚集索引
  2. 由于此次更新,您还有其他索引需要更新,并且这些索引上会发生死锁/阻塞
  3. 您有其他正在运行的事务(更新、选择等)对进程 A 尝试更新的页面具有锁定,并且该进程正在等待已被进程 B 锁定的页面
  4. 您要更新的记录太多,以至于锁升级发生在表锁中

可能还有其他情况。阻塞当然是最常见的事情,但它也可能导致死锁。

【讨论】:

  • 谢谢...但是更新不是在它正在更新的表上获取表锁吗?如果是这样,那么如何同时在同一个锁定表上发生其他更新?我应该使用rowlock而不是default table lock来同时更新同一张表以避免阻塞吗?
  • @user3453057 不,SQL Server 尽量减少锁定。搜索带有锁升级的文章可以详细解释,但可能技术性很强,例如technet.microsoft.com/en-us/library/…
猜你喜欢
  • 2020-08-18
  • 2017-04-03
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2021-10-20
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多