我正在使用 Spring Data JPA 保存对象 save(Object entity) method来自多线程网络应用程序。
偶尔我发现当我使用以下方法从 session 加载对象时:
从 session 返回的对象是陈旧的并且不反射(reflect)数据库中的最新版本。我只保存来自这个应用程序的数据并且只使用一个 Spring Data JPA 实例 界面。
可能是什么原因造成的,我应该如何解决这个问题?
最佳答案
Hibernate 使用 PreparedStatement#executeUpdate 结果来检查更新的行数。如果没有匹配的行,它会抛出 StaleObjectStateException。 (使用 Hibernate API 时)或 OptimisticLockException (使用 JPA 时)。
Optimistic locking是一种通用的并发控制技术,它适用于物理和 application-level transactions .
因此,当多个并发请求修改相同的共享持久数据时,陈旧异常可防止“丢失更新”现象。
在应用程序级事务中,一旦加载实体,由于一级缓存(持久性上下文),您将获得逻辑可重复读取,但其他用户仍然可以修改上述实体。
因此您确实会遇到过时的实体,但乐观锁定机制可防止在不采取任何额外的数据库锁定的情况下丢失更新,它甚至适用于长时间对话。
关于java - Hibernate 在调用 findOne 时返回陈旧的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935978/