ale*_*xey 5 sql sql-server deadlock azure-sql-database
我在SQL Server(Azure SQL)中有一个表:
CREATE TABLE Commands
(
Id int NOT NULL PRIMARY KEY,
Body nvarchar(1000) NOT NULL,
Priority int NOT NULL,
DeliveryDate datetime NOT NULL,
VisibleFrom datetime NULL,
)
Run Code Online (Sandbox Code Playgroud)
该表还有一个索引:
CREATE NONCLUSTERED INDEX IX_PriorityAndDate ON Commands (Priority DESC, DeliveryDate ASC)
Run Code Online (Sandbox Code Playgroud)
然后我有两个会话.
第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
Run Code Online (Sandbox Code Playgroud)
第二节
DELETE FROM Commands WHERE Id = @Id
Run Code Online (Sandbox Code Playgroud)
在某些情况下会发生死锁:
如何解决这个僵局?
在我看来,你遇到了密钥查找僵局
尝试使用以下索引:
CREATE NONCLUSTERED INDEX IX_PriorityAndDate
ON Commands (Priority DESC, DeliveryDate ASC) INCLUDE(VisibleFrom)
Run Code Online (Sandbox Code Playgroud)
或者尝试创建一个新索引:
CREATE NONCLUSTERED INDEX IX_PriorityAndDate
ON Commands(DeliveryDate, VisibleFrom) INCLUDE(Priority)
Run Code Online (Sandbox Code Playgroud)