我正在使用 Spring Data JPA save(Object entity) 方法从多线程 Web 应用程序中保存对象。
有时我发现当我从会话中加载一个对象时,使用:
从会话返回的对象是陈旧的,并且不反映数据库中的最新版本。我只保存来自这个应用程序的数据,并且只使用 Spring Data JPA 接口的一个实例。
什么可能导致它,我应该如何解决这个问题?
我正在使用 Spring Data JPA save(Object entity) 方法从多线程 Web 应用程序中保存对象。
有时我发现当我从会话中加载一个对象时,使用:
从会话返回的对象是陈旧的,并且不反映数据库中的最新版本。我只保存来自这个应用程序的数据,并且只使用 Spring Data JPA 接口的一个实例。
什么可能导致它,我应该如何解决这个问题?
Hibernate 使用 PreparedStatement#executeUpdate 结果来检查更新的行数。如果没有匹配的行,则抛出StaleObjectStateException(使用 Hibernate API 时)或OptimisticLockException(使用 JPA 时)。
乐观锁定是一种通用的并发控制技术,它适用于物理和应用程序级别的事务。
因此,当多个并发请求修改相同的共享持久数据时,陈旧异常可以防止“丢失更新”现象。
在应用程序级事务中,一旦加载实体,由于一级缓存(持久性上下文),您将获得逻辑可重复读取,但其他用户仍然可以修改上述实体。
所以你确实可以遇到过时的实体,但是乐观锁定机制可以防止丢失更新而不需要任何额外的数据库锁,它甚至适用于长时间的对话。