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

Spring Boot-Hibernate,回滚成功异常保存

国俊艾
2023-03-14

我正在使用Spring Boot v2.1.3构建一个应用程序。RELEASE和Hibernate v5.3.6。

之前,我问了一个关于如何跨多个服务/存储库使用@Transactional回滚的问题。我通过使用@OneToOne和@OneToMany注释将我的实体链接在一起,得到了我需要的东西。

现在我面临一个新问题。在单个服务的函数中,我保存了两个单独的实体列表。一个列表保存,另一个列表由于违反唯一键约束而失败。自im测试以来,预计这将失败。

但是,我还没有想出如何用@Transactional注释我的服务或方法,这样当第二个列表无法保存时,它也会回滚第一个列表的任何成功保存。

例如:

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
protected void saveLists() {
    List<Object> list1 = this.repository.getListOne();
    List<Object> list2 = this.repository.getListTwo();

    //Loop through list one and do some manipulation
    //Loop through list two and do some manipulation

    this.repository.saveAll(list1); // this saves all successfully
    this.repository.saveAll(list2); // this has unique key exception

    // rollback both list1 and list2 changes
}

在上面的示例中,list1中的数据成功保存,并在list2中的异常被抛出后出现在数据库中。

我认为,由于它们在相同的服务和相同的方法中,使用相同的存储库,它们将使用相同的事务,并且Hibernate不会提交事务,直到它使该方法没有错误。

但事实似乎并非如此。由于列表1的数据正在提交,而不是回滚。

关于@Transactional注释,我有什么遗漏吗?如何使两个存储作为单个事务工作,并在其中一个存储抛出错误时同时回滚?

共有2个答案

西门骁
2023-03-14

您只需要用@Transactional注释在控制器中调用的服务的方法,而不是此方法。或者可以使用@Transactional注释服务类

翟宏放
2023-03-14

Hello@Transactional不适用于私有或受保护的方法,您的方法应该是公共的。为什么?因为Spring应该创建一个代理来处理事务划分和行为。由于不可能代理受保护或私有的方法,您的注释只是忽略。

 类似资料:
  • case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?

  • 我在tomcat服务器中使用具有多个数据源配置的JTA原子事务。有时我会遇到以下异常: JTA事务意外回滚(可能是由于超时);嵌套的异常是javax。交易回滚异常:事务被设置为仅回滚 出现这种异常的原因是什么?

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?

  • 当异常(NullPointerException)发生时,事务不回滚,并且Customer实体被持久化,但是当我用 事务正在回滚,但我不明白为什么,NullPointerException扩展了RuntimeException,文档说RuntimeException导致回滚。

  • 目标- 到来自(源)MQ队列的消费者消息并发布到 a) 另一个(目标)MQ队列和 b)事务中的Kafka主题,从而避免在MQ或Kafka发布失败的情况下从源MQ中删除消息。 使用的框架 Spring启动版本-2.1.5 Spring JMS-5.1.7 SpringKafka-2.2.6 融合Kafka-5.3 MQ-9 Kafka **应用程序配置类* 实际消费者和发布代码 主Spring靴类

  • 我在我正在开发的一个应用程序中使用了Spring和Hibernate,我在处理事务时遇到了一个问题。 我有一个服务类,它从数据库中加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交给数据库。详细地说: 我得到的错误是这样的: Main.java: RegionService.java: