在 Spring Boot 应用程序的 @Transactional 方法中调用 flush()

Cyb*_*bex 5 java sql spring hibernate jpa

在@Transactional 方法中间调用Hibernate flush() 是否有可能将不完整的结果保存在数据库中?例如,这个函数是否有可能将“John”保存到数据库中?

@Transactional
public void tt() {
    Student s = new Student("John");
    em.persist(s);
    em.flush();
    // Perform some calculations that change some attributes of the instance
    s.setName("Jeff");
}
Run Code Online (Sandbox Code Playgroud)

我用 H2 内存数据库尝试过它,它没有保存不完整的事务更改。但是在某些条件下是否可能并且可能使用另一个数据库引擎?

pir*_*rho 8

在您致电em.commit()或交易结束之前,它不应保存任何内容。我找到的最好的解释来自这里。下面是重要的摘录:

此操作将导致对数据库执行 DML 语句(插入/更新/删除等),但不会提交当前事务。这意味着 flush() 不会使当前更改对其他 EntityManager 实例或其他外部数据库客户端可见;这只会在事务提交时发生。换句话说,flush() 操作只会将当前内存缓存从 EntityManager 刷新到数据库会话。

所以刷新可能会引发一些 JPA 异常,但它实际上不会在事务结束之前提交到数据库。

相关问题:JPA 刷新 vs 提交