我正在使用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
答案 0 :(得分:1)
我有这个问题,因为我的理解是如果有多个线程提交相同行的竞争,则会发生
OptimisticLockException
。
是的,如果实体的OptimisticLockException
属性在提交时比其读取时更高(即已被另一个事务修改),则将抛出Version
。下图(借鉴JPA 2.0 Concurrency and locking)说明了这一点:
但我认为如果隔离级别应用服务器设置为READ COMMITTED,则不应出现这种情况。
为什么呢?使用READ COMMITTED隔离级别时,可能会出现non-repeatable reads,但是:
e1
)总而言之,READ COMMITTED不会阻止OptimisticLockException
。