我有一个基于Java的Web服务(REST API),需要从Oracle DB中的表中读取记录。有可能同时向该API触发2个请求,从而导致两个请求都选择相同的记录进行处理。
如何避免此问题? Oracle只允许选择,而我不知道我们如何才能有效地锁定记录?
答案 0 :(得分:0)
如果两个会话选择相同的行并且提供此子句,则其中一个将被锁定,直到另一个会话释放该锁为止。
答案 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