SQLServer进程队列竞争条件

SQLServer进程队列竞争条件

我有一个订单队列,由多个订单处理器通过存储过程访问。每个处理器输入一个唯一的ID,用于锁定接下来的20个订单供自己使用。然后,存储过程将这些记录返回给要操作的订单处理器。


在某些情况下多个处理器能够检索相同的“OrderTable”记录在那个时候,他们试图同时操作它。这最终导致在稍后的过程中抛出错误。


我的下一个操作是允许每个处理器获取所有可用的订单,只需循环处理程序,但我希望只需保证代码线程的安全,并允许处理器随时获取记录。


因此,明确-任何知道我为什么要经历这种比赛条件和我如何能够解决问题。


BEGIN TRAN

    UPDATE  OrderTable WITH ( ROWLOCK )

    SET     ProcessorID = @PROCID

    WHERE   OrderID IN ( SELECT TOP ( 20 )

                                        OrderID

                                FROM    OrderTable WITH ( ROWLOCK )

                                WHERE   ProcessorID = 0)

COMMIT TRAN



SELECT  OrderID, ProcessorID, etc...

FROM    OrderTable

WHERE   ProcessorID = @PROCID


幕布斯7119047
浏览 700回答 3
3回答

喵喵时光机

这是猜测,但如果没有使用行锁,则处理1更新20行,但锁定超过20行(例如40行)。Process 2更新20行,但跳过40行。所以会错过20排!行锁意味着只有已更新的行被锁定。
打开App,查看更多内容
随时随地看视频慕课网APP