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 方法中。
当然,一致性是以牺牲吞吐量为代价的。
我的应用程序使用 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 方法中。 当然,一致性是以牺牲吞吐量为代价的。