Oracle数据库读锁定

时间:2013-05-29 15:16:31

标签: oracle locking

我想解决一个问题。我需要暂时锁定表上的读数。

这是情景。

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

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

然后,当第二个用户的逻辑调用API时,该数字将被复制并出错。

我希望第一个逻辑锁定表中的读取,同时确定订单号并创建它。然后我可以释放锁定,第二个用户可以继续。

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

2 个答案:

答案 0 :(得分:4)

锁定读取不是解决方法 - 您无法直接锁定Oracle中的读取,而且会过于锁定。

您需要做的是按基本订单号序列化密钥生成过程。

最有效的方法是使用DBMS_Lock,并通过请求“ORDER123NEWKEY”(例如)的独占锁来开始新的密钥生成过程。当插入新行并且更改提交时,然后释放锁。

答案 1 :(得分:4)

您可以使用两个表:ORDERORDER_LINE

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

如果两个会话同时使用相同的order_id调用API,则其中一个会等到第一个提交/回滚。第一个会话提交后,第二个会话将锁定主表,然后是下一个数字。

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

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