Oracle DB中的许多并行事务与事务隔离级别

时间:2018-07-22 16:49:07

标签: oracle concurrency transactions ejb eclipselink

我的应用程序使用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对吞吐量有负面影响。

1 个答案:

答案 0 :(得分:0)

PESSIMISTIC_WRITE锁定模式是解决方案。 PESSIMISTIC_WRITE使用FOR UPDATE(Oracle)在选定的行上获取排他锁。 JPA将LockModeType作为方法参数之一,例如在 find 方法中。 当然,一致性会牺牲吞吐量。