Sql server 多个用户争夺;“下一步”;命令

Sql server 多个用户争夺;“下一步”;命令,sql-server,stored-procedures,transactions,Sql Server,Stored Procedures,Transactions,我有一个调用SQL Server 2016存储过程的应用程序。该过程有一个事务,其中包括从优先顺序排列的订单列表中获取下一个订单,然后该事务在ERP中执行附加插入和更新 我遇到的问题是,当我有多个应用程序在寻找下一个订单时。对于他们来说,查询存储过程中的下一个订单并获得相同的订单并不困难 即使插入/更新将按预期锁定,选择获取下一个订单也不会锁定…因此获取下一个订单的场景很容易出现重复 解决这个问题最干净的方法是什么?如果可能的话,我不希望在select的事务中应用任何自定义锁定。我还研究了引入一

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

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

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


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

解决方案的形式是:

查询以获取下一个订单

  • 开始转换
  • 使用此条件更新此订单的数据库
  • 如果没有受影响的记录,则引发错误并告诉用户重试
  • 否则,继续此订单的其他trans插入和更新
  • 端反式

解决方案的形式为:

查询以获取下一个订单

  • 开始转换
  • 使用此条件更新此订单的数据库
  • 如果没有受影响的记录,则引发错误并告诉用户重试
  • 否则,继续此订单的其他trans插入和更新
  • 端反式

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