我使用的是WebSphere Application Server 7.0.0.0.9 with; OpenJPA 1.2.3-Snapshot'。我设置了JDBC数据源的属性WebSpheredEfaultSolationLevel = 2(读取订单)。我之所以有这个问题,是因为我的理解是如果有多个线程进行同一行,则会发生Optimasticallockexception。但是我认为,如果设置了要读取所做的隔离级应用程序服务器,则永远不会发生这种情况。

这是我得到的例外。

<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 
有帮助吗?

解决方案

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

是的,一个 OptimisticLockException 如果 Version 实体的属性在提交时间比读取时更高(IE已通过另一笔交易修改)。下图说明了这一点(从 JPA 2.0并发和锁定):

alt text

但是我认为,如果设置了要读取所做的隔离级应用程序服务器,则永远不会发生这种情况。

为什么?使用时 阅读承诺 隔离水平, 不可重复的读物 可能会发生:

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

总结一下,阅读承诺不会阻止 OptimisticLockException.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top