为了账号安全,请及时绑定邮箱和手机立即绑定

SQLServer进程队列竞争条件

SQLServer进程队列竞争条件

幕布斯7119047 2019-07-10 15:37:28
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排!行锁意味着只有已更新的行被锁定。

查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 699 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信