Oracle 数据库读锁

标签 oracle locking

我有一个要解决的问题。我需要临时锁定对表的读取。

这是场景。

我必须阅读一个表格来确定以基数开头的最大销售订单。然后我必须在小数点后添加数字。因此,如果我们有订单 123.1 和 123.2,我需要确定我需要创建的下一个订单是 123.3。然后我调用 API 来创建这个订单号。

问题是当两个用户同时想要向基本 123 订单号添加新的销售订单时。一个用户的逻辑判断号码是123.3,调用API创建订单;一旦创建,我提交记录。但是当 API 调用开始时,第二个用户的逻辑正在尝试确定下一个号码,并且根据时间,它也可以选择 123.3 作为下一个可用号码。

然后,一旦第二个用户的逻辑调用 API,该号码就会重复并出错。

我想让第一个逻辑在确定订单号并创建它时锁定表以防止读取。然后我可以释放锁,第二个用户可以继续。

我读过的所有内容似乎都在说我无法阻止对表的读取。

最佳答案

您可以使用两个表:ORDERORDER_LINE .

您生成数字的程序将执行 SELECT * FROM order WHERE order_id = 123 FOR UPDATE ,然后从 ORDER_LINE 中的行中确定适当的数字.

如果两个 session 同时调用相同的 API order_id ,其中一个将等到第一个提交/回滚。一旦第一个 session 提交,第二个 session 将获得主表上的锁,然后是下一个数字。

可以在不同的 order_id 上同时调用 session 无需等待。

如果您不想在并发更新的情况下等待,请使用 FOR UPDATE NOWAIT并返回一条消息,说明订单已被其他用户锁定。

关于Oracle 数据库读锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16817747/

相关文章:

go - 如何在 Go 中实现只使用 atomic 的 "i++ and i>=max ? 0: i"

mysql - 为什么 MySQL 显式谓词锁定不允许在谓词锁之外插入语句

c# - 首先在 EF 代码中进行悲观锁定

WAL模式下的Java SQLite : the database is locked

oracle - 什么 jdbc jar 与 oracle 11g & jdk 1.6 一起使用以及如何连接到数据库本身

java - 道: diffrence between InMemory implementation and Database Implementation

oracle - 在 oracle 10g 中,如何在循环中接受用户输入?

java - JBoss 和 Oracle 12c : datasource bound successfully but cannot connect

c# - 为什么这个 RETURNING INTO 子句会返回一个错误?

mysql - 如何锁定对 MySQL 表的读/写,以便我可以选择然后插入,而无需其他程序读/写数据库?