如果设置了读取所做的启用srv隔离水平,是否会发生opportisticlockexception?
-
28-09-2019 - |
题
我使用的是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并发和锁定):
但是我认为,如果设置了要读取所做的隔离级应用程序服务器,则永远不会发生这种情况。
为什么?使用时 阅读承诺 隔离水平, 不可重复的读物 可能会发生:
- 这不会影响数据的内存表示(
e1
在上面的示例中) - 大多数时候,您不重新阅读数据
- 即使您这样做(并执行不可重复的读取),在提交更改之前,实体仍然可能会被另一个线程修改。
总结一下,阅读承诺不会阻止 OptimisticLockException
.
不隶属于 StackOverflow