使用乐观锁定在JPA 2中检查提交时读取集的版本

时间:2013-09-13 20:50:16

标签: mysql jpa eclipselink hsqldb optimistic-locking

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

当我使用MySQL作为目标数据库时,事情就像我期望的那样发生:当我有一个客户端执行只读事务与客户端执行写操作时,一些只读事务会中止(并重试)。 / p>

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

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

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

2 个答案:

答案 0 :(得分:1)

隔离级别可以解释为什么有些东西在MySql中工作(例如,如果设置为Serializable),但正如你所说,乐观锁定不需要(但正如所说,可能不是在MySql中工作的乐观锁定)

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

此外,我认为您检查过您的实体是否有使用@Version注释的字段,并且您锁定了 EXPLICITLY 实体(通过在调用EntityManager.find时传递LockModeType (),refresh()或lock()),因为不清楚/哪个是默认LockModeTypecheck this discussion)。

此外,如果您想再调试一下,您可以查看哪些查询发送到HSQL(看看herehere也看看如何记录查询)。具体来说,我会检查@Version - 注释字段的更新/检查方式。当然附带调试器。

当然,没有代码就不容易说出可能出现的问题,但我认为这是代码中的一个问题。

答案 1 :(得分:0)

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