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 不在结果集中)?
我惊呆了,现在一点头绪都没有。谢谢
现在选项“访问索引时使用页锁”导致了大量页锁,因此未选中
当你玩火时,你会被烧伤。您是否考虑过将使用什么替代方案?禁用页锁后,有两种可能性:使用行锁粒度或使用行集粒度。由于每页必须至少有一行,因此使用行粒度将变成锁定至少与 page lock 一样多的单个锁,但更有可能更多、更多、更多的锁。因此,它会将糟糕的情况变成更糟糕的情况。使用行集粒度将“治愈”锁管理器的健康状况,因为只会获取一个锁,代价是将所有并发性抛在脑后。不要乱搞你不明白的设置. 顺便说一句,您的问题“行锁是否会导致键锁”清楚地表明您对锁定的理解水平不足以信任更改此类重要设置,无意冒犯。
重要的问题是为什么查询需要页面锁定?页锁是扫描的标志:引擎选择高粒度,因为它知道它有很多行要查看。您的帖子缺少了解死锁所需的关键信息,请发布整个原始死锁 XML 以及完整的架构定义。
至于问题:“rowlocks”资源是 B 树中的“键”和堆中的“rowids”。
归档时间: |
|
查看次数: |
937 次 |
最近记录: |