我目前在 SQL Server 2008 中遇到与特定用户表频繁死锁的问题。以下是有关此特定表的一些事实:
- 有大量的行(1 到 200 万)
- 此表上使用的所有索引仅在其选项中勾选 “使用行锁”编辑:表上只有一个索引是其主键
- 行经常被多个事务更新,但是是唯一的(例如,可能每小时对不同的唯一行执行一千个或更多更新语句)
- 该表不使用分区。
在检查表后sys.tables
,我发现lock_escalation
设置为TABLE
我很想将此表的 lock_escalation 转换为,DISABLE
但我不确定这会产生什么副作用。据我了解,使用DISABLE
将最大限度地减少从级别升级锁TABLE
,如果与索引的行锁设置结合使用,理论上应该最大限度地减少我遇到的死锁。
从我在确定锁升级阈值中读到的内容看来,当单个事务获取 5000 行时,锁似乎会自动升级。
从这个意义上说,单笔交易意味着什么?通过单独的更新/选择语句获得 5000 行的单个会话/连接?
或者它是获取 5000 行或更多行的单个 sql 更新/选择语句?
任何见解都值得赞赏,顺便说一句,n00b DBA 这里
谢谢