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

Many paralllel transactions vs transaction isolation level in Oracle DB

我的应用程序使用 Weblogic Server、EJB、EclipseLink 作为 ORM 检索请求。 业务逻辑如下所示。 Select 来自 table A 的所有记录,其中 A.col = 'ABC'(ABS 是来自请求的值) 如果其中 none 个满足某些条件,则创建一个新的。

现在假设已经发送了 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 对吞吐量有负面影响。

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