在使用spring事务管理时,程序报如下:
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
程序的代码为:
serviceA.methiodA{
beforedone;
methodB();
try{
serviceB.methodB{}; //这里面有异常标记为回滚, doSetRollbackOnly(status);
}catch{
//捕获异常转到commit时,由于已经标记为要回滚, 回滚并抛出新异常
}
other done;
}
//传播:propagation 为 Required
原来是自己没有弄懂spring事务的机制。
这个方法被调用执行时,有两个点是被spring事务代理。serviceA.methodA(),serviceB.methodB(),这两个方法中只要有异常事件将回滚。
(其实因为事务嵌套,serviceA#methodA中有异常标记并直接回滚,serviceB#methodB中有异常只是标记回滚状态,在调用回serviceA#methodA中回滚)。 这个方法中serviceB#methodB有异常事务被标记为回滚,继续执行到serviceA.methodA(), 可是被methodA捕获了,也就不回滚了,一直执行到最后commit。在commit时spring会判断回滚标志,若有回滚标记,回滚并抛出UnexpectedRollbackException异常。
如何解决:
上面就是serviceA#methodA中的方法不被serviceB#methodB影响。想到两个方法好像都不是很好。
1. serviceB.methodB不声明为事务代理。
很多时候serviceB.methodB也被其他地方,是要事务管理的。这时候可以重写一个方法。
但是要注意这个方法中数据的一致性。
2. 和1一样也是重写一个serviceB.methodBNE,里面不抛出异常,也要注意这个方法中数据的一致性。感觉是一样的。
个人感觉在使用尽量不捕获异常,以保证事务一致性,如果有如上面的需求
(如给所有人奖励物品时,当中可能有人条件不足而抛出异常,为不影响下面的要捕获)
可以独立一个包出来专门做一个对多人操作的。而不是在同一个service写两个一样的方法,
导致混乱。
不捕获则在调用serviceB.methodB()时就回滚不会到commit那。
从这次错误中可以得到:
1.弄清楚被spring事务代理方法有哪些,这些方法有异常事务都将回滚
(不含this.methodB调用,动态代理导致)
2. 被代理的方法内部有异常抛出,事务都会标记为回滚,并在最外层调用那回滚。
嵌套事务若是REQUIRED_NEW新事务则在那个方法调用时直接回滚
如上面serviceA#methodA中直接回滚, serviceB#methodB则只标记
3.在事务提交serviceA.methodA(最外层)中
commit(TransactionStatus)在具体提交事务之前会检查rollBackOnly状态,
如果该状态在methodB中被设置,那么转而执行事务的回滚操作。
rollBackOnly状态没被设置,则执行正常的事务提交操作。
分享到:
相关推荐
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理...
在Java企业级应用开发中,Spring框架以其强大的功能和灵活性被广泛应用,特别是在事务管理方面。Spring提供了全面的事务管理解决方案,使得开发者可以方便地控制事务的边界,保证数据的一致性和完整性。本篇将深入...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理:这是通过编写代码来控制事务的开始、提交和回滚。Spring 提供了PlatformTransactionManager接口,如...
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的事务管理功能是它的一大亮点。本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是...
实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...
### Spring事务管理详解 #### 一、Spring事务管理概述 Spring框架提供了强大的事务管理功能,使得开发者能够更方便地管理应用程序中的事务。Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 -...
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务...
Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用中的事务。本文将深入探讨在"spring事务操作试验"中涉及的关键知识点,并结合提供的资源进行详细阐述。 首先,Spring事务管理...
Synchronized锁在Spring事务管理下,导致线程不安全。
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供了强大的事务管理功能,使得开发者可以方便地控制事务的边界,保证数据的一致性和完整性。 首先,理解事务...
Spring 框架的事务管理是其核心特性之一,它为开发者提供了强大的支持,确保了在多线程和并发环境中数据的一致性和完整性。本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异...
Spring 事务管理是Java开发中一个非常重要的概念,特别是在企业级应用开发中,它确保了数据的一致性和完整性。在Spring框架中,事务管理分为编程式事务管理和声明式事务管理两种方式。 一、编程式事务管理 编程式...