【问题标题】:can OptimisticLockException occur if app srv Isolation level is set to READ COMMITTED?如果 app srv 隔离级别设置为 READ COMMITTED,是否会发生 OptimisticLockException?
【发布时间】:2011-04-22 20:55:54
【问题描述】:

我正在使用带有 ;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 

【问题讨论】:

    标签: java orm jpa openjpa isolation-level


    【解决方案1】:

    我有这个问题是因为我的理解是OptimisticLockException 会发生在多线程提交同一行的竞争中。

    是的,如果实体的Version 属性在提交时高于(即已被另一个事务修改),则会抛出OptimisticLockException。如下图所示(借自JPA 2.0 Concurrency and locking):

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2022-09-23
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多