1

我在 JPA2(使用 EclipseLink v2.4)应用程序(没有容器,只有 JavaSE)中使用乐观锁定。我正在尝试实现强一致性,因此我希望在提交时检查事务期间读取的所有对象的版本。

当我使用 MySQL 作为目标数据库时,事情会如我所料地发生:当我有一个客户端执行只读事务同时客户端执行写入时,一些只读事务中止(并重试)。

但是,当我使用 HSQLDB (v2.2.9) 时,只读事务永远不会中止。事实上,tcpdump 根本没有显示任何东西!

这里发生了什么?我尝试过使用隔离级别无济于事。无论如何,我不明白为什么这很重要——似乎 EclipseLink 应该生成大致相同的 SQL,而不管隔离如何。也许正在进行一些奇怪的优化?

阅读 JPA 规范令人困惑。我什至保证会检查我的读取集版本,还是只检查被修改或删除的对象版本?

4

2 回答 2

1

隔离级别可以解释为什么某些事情在 MySql 中起作用(例如,如果设置为 Serializable),但正如您所说,乐观锁定不需要那样(但如前所述,可能不是在 MySql 中起作用的乐观锁定)。

我会尝试升级/降级 HSQLDB 版本,以便快速检查它是否不是 BUG。

此外,我假设您检查了您的实体是否有带注释的字段,@Version并且您明确锁定实体(通过LockModeType在您调用 EntityManager.find()、refresh() 或 lock() 时传递 a),因为不清楚 if/which是默认值LockModeType检查此讨论)。

此外,如果您想进行更多调试,您可以查看发送到 HSQL 的查询(查看此处此处也查看如何记录查询)。具体来说,我会检查@Version-annotated 字段是如何更新/检查的。当然附带调试器。

当然,如果没有代码,很难说可能是什么问题,但我想这是代码的问题。

于 2013-09-19T14:59:35.187 回答
0

HSQL 是一个内存数据库,这可能与它有关。您的两个客户端都在不同的 JVM 中吗?可能不是满足您需求的最佳数据库。

于 2013-09-16T14:55:04.430 回答