我们在保存订单履行的事务表中使用聚集列存储索引。该表由不同的会话定期更新。但是,每个会话都特定于订单作业编号,因此他们不会尝试同时更新同一行。但是,由于会话之间的以下情况,我们面临死锁问题。
- 行组锁定和页面锁定
- 行组锁定和行组锁定
这并不特定于存储过程。这是由于作为订单履行的一部分,多个存储过程按顺序一个接一个地更新此表。
表的示例模式非常简单:
CREATE TABLE OrderFulfillments
(
OrderJobNumber INT NOT NULL,
FulfilledIndividualID BIGINT NOT NULL,
IsIndividualSuppressed BIT NOT NULL,
SuppressionReason VARCHAR(100) NULL
)
我已经给出了示例死锁图供您参考。请让我知道,我可以采取什么方法来避免这种僵局情况。我们需要此表中的聚集列存储索引,因为我们正在执行聚合操作以查看个体已经完成了多少次。如果没有列存储索引,它可能会更慢。