Hibernate在调用findOne时返回过时的对象



我使用多线程web应用程序中的Spring Data JPA save(对象实体)方法保存对象。

偶尔我会发现,当我使用从会话加载对象时

findOne(long id)

从会话返回的对象已过时,不能反映数据库中的最新版本。我只保存来自该应用程序的数据,并且只使用Spring data JPA的一个实例界面

是什么原因导致的?我应该如何解决?

Hibernate使用PreparedStatement#executeUpdate结果来检查更新的行数。如果没有匹配行,则抛出StaleObjectStateException(使用Hibernate API时)或OptimisticLockException(使用JPA时)。

乐观锁定是一种通用的并发控制技术,它适用于物理和应用程序级别的事务。

因此,当多个并发请求修改相同的共享持久数据时,过时的异常可以防止"丢失更新"现象。

在应用程序级事务中,一旦加载实体,由于一级缓存(Persistence Context),您将获得逻辑可重复读取,但其他用户仍然可以修改上述实体。

因此,您确实可以遇到过时的实体,但乐观的锁定机制可以防止丢失更新,而不需要任何额外的数据库锁定,它甚至适用于长时间的对话。

最新更新