【问题标题】:Multiple Users Competing for "Next" Order多个用户竞争“下一个”订单
【发布时间】:2020-08-24 15:26:14
【问题描述】:

我有一个调用 SQL Server 2016 存储过程的应用程序。该过程有一个事务,包括从优先订单列表中获取下一个订单,然后事务在 ERP 中执行额外的插入和更新。

我遇到的问题是,当我有多个这些应用程序在寻找下一个订单时。他们不难查询存储过程中的下一个订单并得到相同的订单。

即使插入/更新会按预期锁定,但获取下一个订单的选择不会锁定...因此获取下一个订单的场景很容易出现重复。

解决此问题的最简洁方法是什么?如果可能的话,我不希望在事务中为选择应用任何自定义锁定。我还考虑过引入一个表格来存储正在“工作”的订单,以防止任何其他读取相同订单的订单。我很惊讶我从未遇到过这种情况,所以希望有人对此有一个干净的最佳实践。

【问题讨论】:

  • 您考虑过使用 SQL Server 的 Service Broker 吗?它提供了开箱即用的排队机制。
  • 感谢 mweber,但似乎这会过度设计问题。我只是想确保当用户 x、y 和 z 向存储过程询问下一个订单时,他们无法获得相同的订单。处理整个下一个订单交易需要 10 秒的最坏情况。在这 10 秒内,用户有可能从程序 b/c 中的下一个订单查询中获得相同的结果,因为查询不会为另一个查询锁定记录。
  • 您可以使用 Sequence 将订单分配给每个用户,这样就不会重复。
  • 我的目标不是过于复杂。我的想法是这对许多人来说一定是一个常见的场景,但看起来这并不是那么常见。我们刚刚测试了下面的答案,它可以工作......防止 2 个用户从查询中获得相同的“下一个订单”。感谢所有反馈。

标签: sql-server stored-procedures transactions


【解决方案1】:

解决方案采用以下形式:

查询下一个订单

  • 开始翻译
  • 使用此条件更新此订单的数据库
  • 如果没有记录受到影响会引发错误并告诉用户重试
  • 否则继续为此订单添加额外的反式插入和更新
  • 结束翻译

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 2013-07-23
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2015-06-19
    相关资源
    最近更新 更多