当前位置: 首页 > 知识库问答 >
问题:

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

邵轶
2023-03-14

在@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内存数据库中尝试了它,它没有保存不完整的事务更改。但是在某些条件下,也许使用另一个DB引擎是否可能?

共有1个答案

拓拔富
2023-03-14

在调用em.commit()或事务结束之前,它不应该保存任何内容。我找到的最好的解释就是从这里。以下是重要摘录:

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

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

相关问题:JPA刷新与提交

 类似资料:
  • 我对@Async和Rest模板调用有问题;下面是我的主要应用程序类,带有一个任务执行器Bean和EnableAsync注释 这是我在Rest控制器中调用的带有异步注释的my测试服务: 此服务在rest模板上返回一个nullPointer;这是stacktrace 但是如果我删除@enableAsync和@Async,那么简单的Rest模板可以很好地工作。 当我传递HttpServlet请求时,Ec

  • 集成测试: 当我偶尔运行这个测试时,一切都很好,但是当我和其他测试一起运行它时,没有使用模拟的ServerThroughRabbitMQ,所以一些spring缓存强制使用旧的rabbit侦听器。 我试图调试它,我可以看到,正确的bean被autowired到测试中,但由于某些原因旧监听器使用(旧bean字段instanceID=1新mocked bean instanceID=3),测试失败(不确

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 我需要在Springboot中实现多线程,同时使用POST方法调用API。我根据一个SELECT查询从oracle数据库中提取记录,然后使用行映射器逐个遍历每个记录。在下一步中,我只调用一个方法将这些记录发送到API,以postmapping的形式发送这些记录并取回记录。 因为select查询一次可以返回10、20或100条记录。逐个调用每条记录并不理想。我在想我是否可以一次发送多个记录。我不知道

  • 我想在intellij Idea中以调试模式启动spring-boot maven应用程序,但当我创建断点时,应用程序不会挂起,而是会继续。我读了很多题目,但还是不明白怎么做。你能帮我决定最好的行动方案吗。 但是当请求LocalHost:5005/MyPage时,我会出现错误101(NET::ERR_CONNECTION_RESET)。似乎有些maven参数没有指定。 下面是我在pom.xml中的

  • 问题内容: 注意:这旨在作为常见问题的规范答案。 我有一个带有字段()的Spring 类(),但是该字段是我尝试使用它时所用的。日志显示同时创建了bean和bean,但是每当尝试在服务bean上调用方法时,我都会得到一个。Spring为什么不自动接线该领域? 控制器类: 服务等级: 应该自动连接的服务bean,但不是: 当我尝试时,出现以下异常: 问题答案: 带注释的字段是因为Spring不知道您