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 TRANSELECT OrderID, ProcessorID, etc...FROM OrderTableWHERE ProcessorID = @PROCID
3 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
这是猜测,但如果没有使用行锁,则处理1更新20行,但锁定超过20行(例如40行)。Process 2更新20行,但跳过40行。所以会错过20排!行锁意味着只有已更新的行被锁定。
添加回答
举报
0/150
提交
取消