索引上的行锁会导致键锁吗?:事务(进程 ID xy)已死锁,包括示例

Pet*_*ock 2 index sql-server-2005

我目前遇到错误(通过 traceID 1222 记录):

keylock hobtid= 8205698989 objectname=mydb.dbo.Orders indexname = _dta_Index_Orders_5_120345_K1_K2_7_1 id=lock43fe181 mode=S AssociatedObjectID = 8205698989 
waiterID = process 85b2566 mode=S requestType=wait
waiter-list
keylock hobtid= 820562208 objectname=mydb.dbo.Orders indexname = pk_Orders_OrderID id=lock4012341 mode=X AssociatedObjectID = 820562208 
resource-list
Update Orders set OrderType = 1 where OrderID = 52000 and DeliveryID = 1236
inputbuf
Update [Orders] set [OrderType] = @1 where [OrderID] = @2 and [DeliveryID] = @3
Run Code Online (Sandbox Code Playgroud)

桌子:

Orders
Run Code Online (Sandbox Code Playgroud)

列:

OrderID         int (pk)
OrderNumber     Varchar(50)
OrderDate       datetime
OrderType       int
DeliveryID  int
DateDelivered   datetime
CustomerID  int
Run Code Online (Sandbox Code Playgroud)

指数:

PK 上有一个聚集索引:

OrderID         int
Run Code Online (Sandbox Code Playgroud)

姓名 pk_Orders_OrderID

导致问题的那个:(我通过从 AssociatedObjectID 获取对象得到它)

_dta_Index_Orders_5_120345_K1_K2_7_12:(非集群)

索引键列:

OrderNumber     Varchar(50)
OrderID         int (pk)
Run Code Online (Sandbox Code Playgroud)

包含的列:

OrderDate       datetime
OrderType       int
Run Code Online (Sandbox Code Playgroud)

现在选项“访问索引时使用页锁”导致了大量页锁,因此未选中。“访问索引时使用行锁”仍然打开。

但是我遇到了上面提到的错误,有趣的是,当客户有时运行冗长的报告时,即使特定报告是针对客户 A 的,也会发生键锁,而发生在订单上的更新是针对客户 B - 因此CustomerIDs 不匹配,因此不应该没有锁,还是我错了?

有问题的钥匙锁词 - 这与“访问索引时使用行锁”直接相关吗?

行锁会导致键锁吗?

会不会是死锁消息:事务(进程 ID xy)在锁定资源上与另一个进程发生死锁,并已被选为死锁受害者。重新运行事务。是在 _dta_Index_Orders_5_120345_K1_K2_7_12 索引扫描时引起的,并且在那个阶段它碰巧扫描了 orderID 52000(即使 OrderID 52000 不在结果集中)?

我惊呆了,现在一点头绪都没有。谢谢

Rem*_*anu 9

现在选项“访问索引时使用页锁”导致了大量页锁,因此未选中

当你玩火时,你会被烧伤。您是否考虑过将使用什么替代方案?禁用页锁后,有两种可能性:使用行锁粒度或使用行集粒度。由于每页必须至少有一行,因此使用行粒度将变成锁定至少与 page lock 一样多的单个锁,但更有可能更多、更多、更多的锁。因此,它会将糟糕的情况变成更糟糕的情况。使用行集粒度将“治愈”锁管理器的健康状况,因为只会获取一个锁,代价是将所有并发性抛在脑后。不要乱搞你不明白的设置. 顺便说一句,您的问题“行锁是否会导致键锁”清楚地表明您对锁定的理解水平不足以信任更改此类重要设置,无意冒犯。

重要的问题是为什么查询需要页面锁定?页锁是扫描的标志:引擎选择高粒度,因为它知道它有很多行要查看。您的帖子缺少了解死锁所需的关键信息,请发布整个原始死锁 XML 以及完整的架构定义。

至于问题:“rowlocks”资源是 B 树中的“键”和堆中的“rowids”。