我有一个要解决的问题。我需要临时锁定对表的读取。
这是场景。
我必须阅读一个表格来确定以基数开头的最大销售订单。然后我必须在小数点后添加数字。因此,如果我们有订单 123.1 和 123.2,我需要确定我需要创建的下一个订单是 123.3。然后我调用 API 来创建这个订单号。
问题是当两个用户同时想要向基本 123 订单号添加新的销售订单时。一个用户的逻辑判断号码是123.3,调用API创建订单;一旦创建,我提交记录。但是当 API 调用开始时,第二个用户的逻辑正在尝试确定下一个号码,并且根据时间,它也可以选择 123.3 作为下一个可用号码。
然后,一旦第二个用户的逻辑调用 API,该号码就会重复并出错。
我想让第一个逻辑在确定订单号并创建它时锁定表以防止读取。然后我可以释放锁,第二个用户可以继续。
我读过的一切似乎都在说我无法阻止对表的读取。
您可以使用两个表:ORDER和ORDER_LINE。
生成数字的过程将执行 a SELECT * FROM order WHERE order_id = 123 FOR UPDATE,然后从 中的行中确定适当的数字ORDER_LINE。
如果两个会话同时使用相同的 调用 API order_id,其中一个将等到第一个提交/回滚。一旦第一个会话提交,第二个会话将获得主表上的锁,然后是下一个数字。
可以在不同的order_id情况下同时调用会话而无需等待。
如果您不想在并发更新的情况下等待,请使用FOR UPDATE NOWAIT并返回订单已被其他用户锁定的消息。
| 归档时间: |
|
| 查看次数: |
2625 次 |
| 最近记录: |