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

标签 mysql jpa eclipselink hsqldb optimistic-locking

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

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

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

这是怎么回事?我试过玩弄隔离级别无济于事。我不明白为什么这会很重要——不管隔离如何,EclipseLink 似乎应该生成大致相同的 SQL。也许正在进行一些奇怪的优化?

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

最佳答案

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

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

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

此外,如果您想进行更多调试,您可以查看向 HSQL 发送了哪些查询(查看 herehere 以及如何记录查询)。具体来说,我会检查如何更新/检查带注释的 @Version 字段。当然附带调试器。

当然,如果没有代码,很难说出问题所在,但我认为这是代码中的问题。

关于mysql - 使用乐观锁定检查 JPA 2 中提交时读取集的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795021/

相关文章:

php - 如何在文本区域和数据库之间保留换行符?

java - 尝试使用 JPA 注释保存具有复合键和基本值的映射

jpa - 如何修改 Eclipselink JPA 2.0 连接重试行为

mysql - 复杂的? MySQL查询

mysql - 在mysql中使用主键作为大表的外键

java - JPA - 使用 mappedBy 属性定义拥有实体的区别

java - 使用 spring jpa 编写 group by 表达式

java - JPA : multiple transactions

java - JPA 计算相关实体而不加入它们

php - php变量中的mysql查询结果