我有一个非常简单的队列表和几个线程,它们将来自队列表的消息排队并出列。使用SQL Server 2012。
我在下面的dequeue SQL中遇到了死锁。有人可以给我一个提示,问题是什么以及如何预防?
谢谢!
错误:
事务(进程ID 96)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。
代码:
// ENQUEUE
BEGIN
DECLARE @SendSequenceId bigint;
SET @SendSequenceId = NEXT VALUE FOR [dbo].[SEQ_SEND_MESSAGE_QUEUE_ID]
UPDATE TOP (1) [dbo].[MESSAGE_QUEUE] WITH (ROWLOCK)
SET [MessageId] = @SendSequenceId,
[IsUsed] = 1
WHERE IsUsed = 0
END
// DEQUEUE
BEGIN
UPDATE TOP (1) [dbo].[MESSAGE_QUEUE] WITH (ROWLOCK)
SET
@MessageOut = [Message],
[IsUsed] = 0,
[MessageId] = NULL,
[Status] = 0,
[Message] = ''
WHERE IsUsed = 1
END