必威体育Betway必威体育官网
当前位置:首页 > IT技术

Spring事务管理之回滚异常rollback-for

时间:2019-10-01 11:14:24来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

rollback

一、业务背景

业务需求:服务层调用多个dao方法,要求只要有一条数据库执行语句出错,则全部回滚。而实际情况是前面四条执行成功,第五条失败,结果只是抛出异常提示,前面四条还是成功执行。

二、出错原因

异常分为checked Exception 捕获异常 跟 unchecked Exception 未捕获异常,Spring默认发生未捕获异常时自动回滚,如发生runtimeexception。项目中都有针对调用dao层方法做try-catch处理,即已经对异常做出捕获处理,不满足Spring默认自动回滚情况,所以才会出现上面所述情况。

三、解决方案(两种)

如果想要不管有没有捕获异常做处理,只要其中一条发生异常,则全部回滚,那么可以采用下面两种配置方法:

1、xml文件中进行显示配置

<!-- 事务配置 -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

<!-- 增加事务回滚切面扫描配置,不加的话有捕获异常就不回滚 -->

<aop:config>

<aop:pointcut id="serviceOperation" expression="execution(* com.abc.service..*.*(..))"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>

</aop:config>

<!--事务管理,ServiceException事务回滚-->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="get*" read-only="true" />

<tx:method name="query*" read-only="true" />

<tx:method name="find*" read-only="true" />

<tx:method name="load*" read-only="true" />

<tx:method name="select*" read-only="true" />

<tx:method name="*" rollback-for="Exception" />

</tx:attributes>

</tx:advice>

其中execution(* com.abc.service..*.*(..))表示:service包和所有子包里的任意类的任意方法。当然数据源记得配置,注解驱动及service类上加@transactional可有可无。

2、采用注解@Transactional

配置@Transactional注解的rollbackFor属性,即在每个需要回滚的service类上加@Transactional(rollbackFor = Exception.class),代替xml的切面配置及事务管理

相关阅读

spring data jpa-由mybatis切换

最近重构以前写的服务,最大的一个变动是将mybatis切换为spring data jpa,切换的原因很简单,有两点:第一、它是spring的子项目能够和sp

转-Spring的多事务配置(多个Transaction Manager)和使用

转自:http://blog.csdn.net/clementad/article/details/47275227 大多数项目只需要一个事务管理器。然而,有些项目为了提高效率、或

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载

Spring的ContextLoaderListener加载上下文的源码分析

前言: 1,如果使用自定义的监听器,需要经过下面的步骤 1到步骤10 2,如果使用Spring自己的监听器ContextLoaderListener,需要经过下面的

spring中packagesToScan的解释

spring中packagesToScan的解释 使用早前版本的spring,又恰好采用了Annotation注解方式(而非传统XML方式)配置hibernate对象关系映射,

分享到:

栏目导航

推荐阅读

热门阅读