如果app srv Isolation level设置为READ COMMITTED,会发生OptimisticLockException吗?

时间:2010-10-08 12:30:28

标签: java orm jpa openjpa isolation-level

我正在使用Websphere应用服务器7.0.0.0.9; OpenJPA 1.2.3-SNAPSHOT'。 我有jdbc数据源的set属性webSphereDefaultIsolationLevel = 2(READ COMMITTED)。 我有这个问题,因为我的理解是如果有多个线程提交同一行的竞争,就会发生OptimasticLockException。 但我认为如果隔离级别应用服务器设置为READ COMMITTED,则不应发生这种情况。

这是我得到的例外......

<openjpa-1.2.3-SNAPSHOT-r422266:907835 fatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance 

1 个答案:

答案 0 :(得分:1)

  

我有这个问题,因为我的理解是如果有多个线程提交相同行的竞争,则会发生OptimisticLockException

是的,如果实体的OptimisticLockException属性在提交时比其读取时更高(即已被另一个事务修改),则将抛出Version。下图(借鉴JPA 2.0 Concurrency and locking)说明了这一点:

alt text

  

但我认为如果隔离级别应用服务器设置为READ COMMITTED,则不应出现这种情况。

为什么呢?使用READ COMMITTED隔离级别时,可能会出现non-repeatable reads,但是:

  1. 这不会影响数据的内存表示(上例中为e1
  2. 大多数时候,您不会重新读取数据
    • 即使您这样做(并执行不可重复的读取),在提交更改之前,实体仍可能被另一个线程修改。
  3. 总而言之,READ COMMITTED不会阻止OptimisticLockException