我在JPA2(使用EclipseLink v2.4)应用程序中使用乐观锁定(没有容器,只有JavaSE)。我正在尝试实现强一致性,所以我希望在提交时检查事务期间读取的所有对象的版本。
当我使用MySQL作为目标数据库时,事情就像我期望的那样发生:当我有一个客户端执行只读事务与客户端执行写操作时,一些只读事务会中止(并重试)。 / p>
但是,当我使用HSQLDB(v2.2.9)时,只读事务永远不会中止。事实上,tcpdump根本没有显示任何内容!
这里发生了什么?我试过玩隔离级别无济于事。我不明白为什么这才重要 - 似乎EclipseLink应该生成大致相同的SQL而不管隔离。也许正在进行一些奇怪的优化?
阅读JPA规范令人困惑。我甚至保证会检查我的阅读集版本,还是仅保证修改或删除的对象版本?
答案 0 :(得分:1)
隔离级别可以解释为什么有些东西在MySql中工作(例如,如果设置为Serializable),但正如你所说,乐观锁定不需要(但正如所说,可能不是在MySql中工作的乐观锁定)
我会尝试升级/降级HSQLDB版本,以便快速检查它是不是那里的BUG。
此外,我认为您检查过您的实体是否有使用@Version
注释的字段,并且您锁定了 EXPLICITLY 实体(通过在调用EntityManager.find时传递LockModeType
(),refresh()或lock()),因为不清楚/哪个是默认LockModeType
(check this discussion)。
此外,如果您想再调试一下,您可以查看哪些查询发送到HSQL(看看here和here也看看如何记录查询)。具体来说,我会检查@Version
- 注释字段的更新/检查方式。当然附带调试器。
当然,没有代码就不容易说出可能出现的问题,但我认为这是代码中的一个问题。
答案 1 :(得分:0)
HSQL是一个内存数据库,可能与它有关。您的客户端是否位于不同的JVM中?可能不是满足您需求的最佳数据库。