使用多线程时队列表中的死锁

时间:2017-10-23 16:01:58

标签: sql-server tsql sql-server-2012

我有一个非常简单的队列表和几个线程,它们将来自队列表的消息排队并出列。使用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

0 个答案:

没有答案