`

异常捕获不抛出,Spring事务无法回滚

阅读更多

默认spring只在发生未被捕获的runtimeexcetpion时才回滚。

 

最笨的办法:代码级控制:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

 

为何在aop  advitor中配置rollba-for=“java.lang.Exception”异常时不回滚呢?

 

待续,这个问题必须解决

 

 

问题已解决:

 

原理:spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过
<tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
配置来捕获特定的异常并回滚

换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚

 

解决方案:

方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理

方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

 


 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="add*" propagation="REQUIRED" />
   <tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
   <tx:method name="del*" propagation="REQUIRED" />
   <tx:method name="*" propagation="SUPPORTS" />
  </tx:attributes>
 </tx:advice>

 <aop:config>
  <aop:pointcut id="canyin" expression="execution(* com.laphone.base.baseservice.*.*(..)) ||execution(* com.laphone.canyin.*.service.*.*(..)) || execution(* com.laphone.canyin.*.*.service.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="canyin" />
 </aop:config>

分享到:
评论

相关推荐

    子线程任务发生异常,主线程事务如何回滚

    其中,Callable 接口的 call 方法可以抛出异常,而 Runnable 接口的 run 方法不能抛出异常。因此,如果我们想捕获子线程的执行结果或异常,就应该使用 Callable 接口。 二、线程池的使用 在 Java 中,我们可以使用...

    spring 简单实例 事务回滚

    4. 异常处理:为了触发事务回滚,方法内通常会抛出未检查异常(继承自`RuntimeException`的异常)或显式指定需要回滚的检查异常。Spring默认只在遇到未检查异常时自动回滚事务,如果需要在特定检查异常下回滚,可以...

    Spring异常捕获且回滚事务解决方案

    Spring 异常捕获且回滚事务解决方案 在 Spring 框架中,异常捕获和回滚事务是非常重要的概念。今天,我们将讨论如何在 Spring 中捕获异常并回滚事务。 首先,让我们了解一下 Spring 的事务机制。当我们在 Spring ...

    spring事务异常回滚实例解析

    在这个例子中,虽然捕获到了异常并记录了日志,但由于没有重新抛出异常,Spring 的 AOP 代理无法感知到异常,因此事务不会回滚。 然而,当我们在异常处理中加入重新抛出异常的操作,如 `throw new RuntimeException...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    然而,如果`methodB`的异常没有被捕获并重新抛出,而是被忽略或者处理了,那么Spring可能无法检测到这个异常,从而不会回滚`methodA`的事务。因此,捕获并重新抛出异常是至关重要的,如示例代码所示。 此外,需要...

    Spring中@Transactional事务回滚(含实例

    如果在`try`块中抛出了需要回滚的异常,即使在`catch`块中没有再次抛出,事务仍会被回滚,因为Spring是在方法级别管理事务,而非`try-catch`块。 七、总结 `@Transactional`注解简化了Java开发中的事务管理,使得...

    Spring事务传播机制.docx

    在这种情况下,子事务异常情况下,主事务捕获了子事务的异常却仍发生了回滚。从代码来看,回滚的原因在于,子事务失败的时候在回滚代码中设置了全局回滚的标识(AbstractPlatformTransactionManager.processRollback...

    Java Spring 事务回滚详解

    如果方法中抛出了未被捕获的异常,Spring会自动回滚事务;反之,如果方法正常结束,事务会被提交。 在Spring中,事务回滚规则基于异常类型。默认情况下,只有未检查异常(RuntimeException及其子类)会导致事务回滚...

    Spring事务管理失效原因汇总

    例如,将异常捕获后未重新抛出unchecked异常,导致事务回滚的条件不成立。 5. 事务传播行为配置错误。比如,在需要REQUIRES_NEW传播行为的情况下配置了REQUIRED。 为了确保事务管理的有效性,开发者应该理解并正确...

    Spring中的@Transactional事物回滚实例源码

    在这个例子中,`createUser`方法被标记为事务性的,如果在方法内部抛出未捕获的异常,Spring会自动回滚事务,确保数据一致性。 Spring事务管理的工作流程大致如下: 1. **AOP代理**:Spring使用AOP(面向切面编程)...

    Spring事务管理配置文件问题排查

    - 默认情况下,只有在未捕获的`RuntimeException`或`Error`抛出时,Spring才会回滚事务。对于受检查的异常(即继承自`Exception`而非`RuntimeException`的异常),事务不会自动回滚。 - 如果希望在抛出特定受检查...

    spring 事务基于注解模式

    Spring默认会在出现未捕获的运行时异常时回滚事务。通过`rollbackFor`和`noRollbackFor`属性,我们可以自定义哪些异常应触发回滚,哪些异常不应触发回滚。 ### 5. 性能考虑 虽然基于注解的事务管理简化了开发,但...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    SpringBoot的事务使用和回滚功能讲解.docx

    这种方法通常在捕获到异常后并且不重新抛出时使用,以确保事务不会因为方法的“成功”执行而提交。 5. **异常处理与事务回滚**: 在`try-catch`块中,如果捕获到一个`RuntimeException`但没有重新抛出,Spring将...

    spring事务总结.docx

    1. **未被捕获的异常**:如果事务中的代码抛出了未被捕获的异常,Spring将自动回滚事务。 2. **显式回滚**:开发者可以在事务代码中显式调用`TransactionStatus.setRollbackOnly()`方法来强制回滚事务。 3. **特定...

    spring 事务处理

    - NEVER:不允许存在事务,如果当前存在事务,抛出异常。 - NESTED:如果当前存在事务,则创建一个嵌套事务;否则行为同REQUIRED。 理解并熟练掌握Spring声明式事务处理是每个Spring开发者必备的技能。正确地配置...

    Spring事务不生效.pdf

    Spring事务的回滚规则默认是基于异常的,即只有当方法抛出未捕获的运行时异常时,事务才会回滚。如果捕获了这些异常,事务就不会回滚。例如: ```java @Service public class UserService { @Transactional ...

    Spring Nested事务简单案例

    因此,即使在子事务中抛出并捕获了异常,只要不重新抛出,事务还是会继续执行。 4. **嵌套事务的深度**:理论上,你可以无限嵌套事务,但实际应用中应避免过深的嵌套,因为它可能导致性能问题,并增加代码的复杂性...

    java事务回滚失败问题分析

    在自定义异常时,需要让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理。 Java事务回滚失败问题分析需要注意检查型异常和非检查型异常的区别,并采取相应的处理方法,使用...

    Spring事务管理

    当发生未捕获的运行时异常或特定的检查异常(由@Transactional注解的rollbackFor属性指定)时,Spring会自动回滚事务。对于未列出的异常,Spring不会自动回滚。 六、异常传播与事务 在声明式事务管理中,如果@...

Global site tag (gtag.js) - Google Analytics