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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Spring Cloud 2020.0.0正式发布再见了Netflix
这篇文章主要介绍了Spring Cloud 2020.0.0正式发布再见了Netflix,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法
这篇文章主要介绍了文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法的相关资料,需要的朋友可以参考下2016-04-04IntelliJ IDEA 2019.2 x64的安装、应用与简单配置(图文)
这篇文章主要介绍了IntelliJ IDEA 2019.2 x64的安装、应用与简单配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-10-10Java多线程中的ThreadPoolExecutor使用解析
这篇文章主要介绍了Java多线程中的ThreadPoolExecutor使用解析,作为线程池的缓冲,当新增线程超过maximumPoolSize时,会将新增线程暂时存放到该队列中,需要的朋友可以参考下2023-12-12com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区
这篇文章主要介绍了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别以及设定serverTimezone的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-09-09
最新评论