我正在使用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注释,我有什么遗漏吗?如何使两个存储作为单个事务工作,并在其中一个存储抛出错误时同时回滚?
您只需要用@Transactional注释在控制器中调用的服务的方法,而不是此方法。或者可以使用@Transactional注释服务类
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: