有没有一种方法可以从Oracle中选择记录并锁定它们,以避免被另一个请求读取?

时间:2019-03-28 22:29:36

标签: java oracle locking

我有一个基于Java的Web服务(REST API),需要从Oracle DB中的表中读取记录。有可能同时向该API触发2个请求,从而导致两个请求都选择相同的记录进行处理。

如何避免此问题? Oracle只允许选择,而我不知道我们如何才能有效地锁定记录?

2 个答案:

答案 0 :(得分:0)

看看SELECT ... FOR UPDATE子句。

如果两个会话选择相同的行并且提供此子句,则其中一个将被锁定,直到另一个会话释放该锁为止。

答案 1 :(得分:0)

我真的对此要求持怀疑态度。您说您的REST API将读取表中的记录。因此,无需锁定表中的行。两个会话可以从同一个表中读取值。 Oracle保证语句的读取一致性,因此您知道每个语句在单个时刻都反映了该表。

如果您需要对一个表执行 multiple select语句,并且担心它会在两个语句之间被修改,则可以执行ALTER SESSION SET TRANSACTION READ ONLY给您交易级别读取一致性。您不需要锁定任何东西。

  

该事务中的所有后续查询仅看到   在交易开始之前提交。只读事务是   对于针对一个或多个查询运行多个查询的报表很有用   表格,而其他用户更新这些相同的表格。

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10005.htm#SQLRF01705