Sql 两个指数死锁
我在SQL Server(Azure 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
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
在某些情况下,会发生死锁:
如何解决此死锁?在我看来,您拥有关键的查找死锁 尝试使用以下索引:
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)