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

时间:2019-01-18 16:28:46

标签: 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");
}

我在H2内存数据库中进行了尝试,但没有保存不完整的交易更改。但是在某些情况下,也许在另一个数据库引擎上,这可能吗?

1 个答案:

答案 0 :(得分:1)

在致电em.commit()或交易结束之前,它不应保存任何内容。我发现的最佳解释是来自here。下面是基本摘录:

  

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

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