我正在使用spring jpa。我已经使用
实现了事务管理@org.springframework.transaction.annotation.Transactional
最近我注意到,虽然在某些情况下交易管理工作正常,但在其他情况下则不然。例如,我在服务方法中有这段代码,由guardianService.save(newFather);
parentsSet.add(newFather);
Guardian oldMother = guardianService.findById(motherId);
注释。
方法中的代码
guardianService.findById(motherId)
在上述情况下,数据库中的数据不会持续到第3行。一旦应用程序完成执行第3行,即使应用程序在第3行之后生成异常,newFather的数据也会被引用到数据库。
@Override
public Guardian findById(long guardianId) {
return guardianRepository.findByGuardianId(guardianId);
}
public interface GuardianRepository extends JpaRepository<Guardian, Long> {
Guardian findByGuardianId(long id);
}
内部GuardianRepository
guardianService.save(newFather);
@Override
@Transactional
public Guardian save(Guardian guardian) {
return guardianRepository.save(guardian);
}
find()
所以我的问题是flush()
方法是否以某种方式调用commit()
或Math.max(n, Coin(n / 2) + Coin(n / 3) + Coin(n / 4))
?
答案 0 :(得分:4)
find()
方法实际上会调用flush
方法。默认情况下,在JPA中,FlushModeType设置为AUTO,这意味着如果发生对数据库的查询,则数据库中的数据必须是当前事务的最新数据。根据定义:
在事务中执行查询时,如果是FlushModeType.AUTO 在Query对象上设置,或者如果为flush的刷新模式设置 持久性上下文是AUTO(默认值)和刷新模式设置 没有为Query对象指定,持久性提供程序是 负责确保所有实体状态的所有更新 在持久性上下文中可能会影响结果 对查询的处理可以看到查询。