我的应用程序使用Weblogic Server,EJB,EclipseLink作为ORM检索请求。 业务逻辑如下所示。 从表A中选择所有记录,其中A.col ='ABC'(ABS是来自请求的值) 如果它们都不满足某些条件,请创建一个新条件。
现在假设已使用相同的有效载荷发送了10个并行请求。 我的Oracle数据库中具有默认的隔离级别(READ_COMMITED)。在这种情况下,许多事务并行执行:
Req1 start T1
Req2 start T2
T1 select rows
T2 select rows
T1 insert new one (no rows with col = 'ABC')
T1 COMMIT
T2 insert new one (no rows with col = 'ABC')
T2 COMMIT
结果,将创建1-10行而不是1行。
Oracle没有REPEATABLE_READS隔离级别。 SERIALIZABLE对吞吐量有负面影响。
答案 0 :(得分:0)
PESSIMISTIC_WRITE锁定模式是解决方案。 PESSIMISTIC_WRITE使用FOR UPDATE(Oracle)在选定的行上获取排他锁。 JPA将LockModeType作为方法参数之一,例如在 find 方法中。 当然,一致性会牺牲吞吐量。