问题描述
我有一个调用sql Server 2016存储过程的应用程序。该过程的事务包括从优先顺序列表中获取下一个订单,然后该事务在ERP中进行其他插入和更新。
我遇到的问题是,当我有多个应用程序在寻找下一个订单时。对于他们来说,查询存储过程中的下一个顺序并获得相同的顺序并不难。
即使插入/更新将按预期锁定,但获取下一个订单的选择也不会锁定...因此,获取下一个订单的情况容易重复。
解决这个问题的最干净的方法是什么?如果可能的话,我不希望在事务中对选择应用任何自定义锁定。我还研究过引入一个表来存储正在“工作”的顺序,以防止对该顺序进行任何其他读取。令我惊讶的是我从未遇到过,所以希望有人对此有一个最佳的最佳实践。
解决方法
解决方案采用以下形式:
查询以获取下一个订单
- 开始翻译
- 使用此条件为此订单更新数据库
- 如果没有受影响的记录引发错误,并告诉用户重试
- 否则,该订单将继续进行其他反式插入和更新
- 结束翻译