1

我正在使用带有“OpenJPA 1.2.3-SNAPSHOT”的 Websphere 应用程序服务器 7.0.0.0.9。我有 jdbc 数据源 webSphereDefaultIsolationLevel=2 的 Set 属性(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 
4

1 回答 1

1

我有这个问题是因为我的理解是,OptimisticLockException如果存在多线程提交同一行的竞赛,就会发生这种情况。

是的,如果实体的属性在提交时高于读取时(即已被另一个事务修改),OptimisticLockException则会抛出an 。Version下图说明了这一点(借用自JPA 2.0 并发和锁定):

替代文字

但我认为如果隔离级别应用服务器设置为 READ COMMITTED,这种情况永远不会发生。

为什么?使用READ COMMITTED隔离级别时,可能会发生不可重复读取,但是:

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

总而言之,READ COMMITTED 不会阻止OptimisticLockException.

于 2010-10-09T03:05:33.450 回答