如何在SQL Server 2008中有效地使用LOCK_ESCALATION

Avi*_*ias 12 sql-server deadlock locking

我目前在SQL Server 2008中使用特定用户表频繁死锁时遇到麻烦.以下是有关此特定表的一些事实:

  1. 有大量的行(1到2百万)
  2. 此表中使用的所有索引仅在其选项中勾选 "使用行锁定" 编辑:表上只有一个索引是其主键
  3. 行经常由多个事务更新,但是是唯一的(例如,每小时可能会有一千个或更多个更新语句被执行到不同的唯一行)
  4. 该表不使用分区.

检查表格后sys.tables,我发现lock_escalation设置为TABLE

我非常想把这张桌子的lock_escalation转到,DISABLE但我不确定这会产生什么副作用.从我的理解,使用DISABLE将最小化升级锁从TABLE级别,如果与索引的行锁设置结合,理论上应该最小化我遇到的死锁..

根据我在确定锁升级阈值时所看到的,当单个事务获取5000行时,锁定似乎会自动升级.

在这个意义上,单笔交易意味着什么?单个会话/连接通过单独的更新/选择语句获得5000行?

或者是一个获取5000行或更多行的单个sql update/select语句?

非常感谢,btw,n00b DBA在这里

谢谢

小智 9

当语句在SINGLE对象上保存超过5000个锁时,会触发LOCK Escalation.在同一个表的两个不同索引上持有3000个锁的语句不会触发升级.

当尝试锁定升级并且对象上存在冲突锁定时,尝试将中止并在另外1250次锁定后重试(保持,未获取)

因此,如果您对各行执行了更新,并且列上有支持索引,则锁定升级不是您的问题.

您将能够使用分析器中的Locks-> lock escalation事件来验证这一点.

我建议你捕获死锁跟踪以确定死锁的实际原因.