Sql 两个指数死锁

Sql 两个指数死锁,sql,sql-server,azure-sql-database,deadlock,Sql,Sql Server,Azure Sql Database,Deadlock,我在SQL Server(Azure SQL)中有一个表: 该表还有一个索引: CREATE NONCLUSTERED INDEX IX_PriorityAndDate ON Commands (Priority DESC, DeliveryDate ASC) 然后我有两节课 第1课时 WITH command AS ( SELECT TOP(1) * FROM Commands q WHERE q.DeliveryDate <= @CurrentDate

我在SQL Server(Azure SQL)中有一个表:

该表还有一个索引:

CREATE NONCLUSTERED INDEX IX_PriorityAndDate ON Commands (Priority DESC, DeliveryDate ASC)
然后我有两节课

第1课时

WITH command AS
(
    SELECT TOP(1) *
    FROM Commands q
    WHERE q.DeliveryDate <= @CurrentDate
      AND (q.VisibleFrom IS NULL OR q.VisibleFrom <= @CurrentDate)
    ORDER BY q.Priority DESC, q.DeliveryDate
)
UPDATE command SET command.VisibleFrom = DATEADD(SECOND, @LeaseTimeout, @CurrentDate)
OUTPUT inserted.Id,
       inserted.Body
在某些情况下,会发生死锁:

  • 会话1锁定IX_优先级和日期索引(U锁定)
  • 会话2锁定PK_命令索引(X锁定)
  • 会话1阻止等待PK_命令(获取U锁)
  • 会话2阻止等待IX_优先级和日期(获取X锁)

  • 如何解决此死锁?

    在我看来,您拥有关键的查找死锁

    尝试使用以下索引:

    CREATE NONCLUSTERED INDEX IX_PriorityAndDate
      ON Commands (Priority DESC, DeliveryDate ASC) INCLUDE(VisibleFrom)
    
    或者尝试创建新索引:

    CREATE NONCLUSTERED INDEX IX_PriorityAndDate
      ON Commands(DeliveryDate, VisibleFrom) INCLUDE(Priority)
    

    同一个命令同时被更新和删除,这不是一个逻辑错误吗?或者IX_PriorityAndDate上的索引访问是否读取了多行?在这种情况下,为什么会有UPDLOCK提示?删除它并使用读取提交或快照隔离。这不是一个逻辑错误,这些查询是在不同的上下文中针对不同的行执行的。无论是否带有(UPDLOCK)提示,都会发生相同的死锁。我将删除它以使问题更清楚。这些语句在什么隔离级别下运行?检查执行计划以确保索引按预期使用(即无扫描/排序)。@usr,它已被读取提交。
    CREATE NONCLUSTERED INDEX IX_PriorityAndDate
      ON Commands (Priority DESC, DeliveryDate ASC) INCLUDE(VisibleFrom)
    
    CREATE NONCLUSTERED INDEX IX_PriorityAndDate
      ON Commands(DeliveryDate, VisibleFrom) INCLUDE(Priority)