spring+aop管理事务

spring+aop管理事务的配置方法

 

1.注册事务管理器c3p0的配置参考以前的文章

Xml代码   收藏代码
  1. <!-- 事务管理器 -->  
  2. <bean name="transactionManager"  
  3.     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  4.     <property name="dataSource" ref="c3p0"></property>  
  5. </bean>  

 

2.配置advice

Xml代码   收藏代码
  1. <!-- 配置事务特性 -->  
  2. <tx:advice id="transactionAdvice" transaction-manager="transactionManager">  
  3.     <tx:attributes>  
  4.         <tx:method name="delete*" propagation="REQUIRED" read-only="false"  
  5.             rollback-for="java.lang.Exception" />  
  6.         <tx:method name="insert*" propagation="REQUIRED" read-only="false"  
  7.             rollback-for="java.lang.Exception" />  
  8.         <tx:method name="update*" propagation="REQUIRED" read-only="false"  
  9.             rollback-for="java.lang.Exception" />  
  10.         <tx:method name="save*" propagation="REQUIRED" read-only="false"  
  11.             rollback-for="java.lang.Exception" />                  
  12.         <tx:method name="*" propagation="SUPPORTS" read-only="true" />  
  13.     </tx:attributes>  
  14. </tx:advice>  

 以delete,insert,update,save开头的方法,需要加上事务控制。

 

下面是Spring中Propagation类的事务属性详解:

REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

 

3.配置aop切面

把事务控制配置在service层的进出口

Xml代码   收藏代码
  1. <!-- 配置AOP切面 哪些类的方法需要进行事务管理 -->  
  2. <aop:config>  
  3.     <!--把事务控制在Service层 -->  
  4.     <aop:pointcut id="allManagerMethod" expression="execution(public * hr.service..*.*(..))" />  
  5.     <aop:advisor pointcut-ref="allManagerMethod" advice-ref="transactionAdvice" />  
  6. </aop:config>  

 

 

4.手动rollback特殊处理

一般发生异常时,controller层捕获该异常,然后迁移到专用的异常出错画面并显示异常信息

上面advice的配置,当发生异常时,spring就会自动rollback。

但是,有时会有在程序处理中途,需要手动rollback并提示用户错误消息。

这种情况下,如果抛出RuntimeExcpetion,应用就会rollback并迁移到专用的异常出错画面。但这不是所希望的,该怎么办呢?

解决方法:

a)定义特殊的RollbackException类

Java代码   收藏代码
  1. public class RollbackException extends Exception {  
  2.   
  3. }  

 

b)程序处理中途需要rollback时,在service层方法中抛出RollbackException

Java代码   收藏代码
  1. // 如果已抵扣金额 >0  
  2. // 则报错 E000000255   
  3. // 否则的话,删除此记录。  
  4. for(Map<String, Object> tmp : E_ACC_SUPPLIER_CANCEL_OUT){  
  5.     if(parseToBigDecimal(tmp.get("CANCEL_OUT_AMOUNT")).compareTo(new BigDecimal("0")) == 1){  
  6.         throw new RollbackException("E000000255","供应商");  
  7.     }  
  8. }  

 

c)在controller层捕获RollbackException,然后就不要再抛出Exception

Java代码   收藏代码
  1. @RequestMapping("saveBatchRemark")  
  2. @ResponseBody  
  3. public Map<String, Object> saveBatchRemark(@RequestBody Map<String, Object> ajaxParam) throws Exception {  
  4.     IBean bean = this.getAjaxBean(ajaxParam);  
  5.     try{  
  6.         // 插入批量备注  
  7.         return batchRemarkService.insertBatchRemark(bean);  
  8.     } catch (RollbackException re) {  
  9.         // 这里是 rollback 后的处理  
  10.         commonService.setAjaxFailMsg(commonService.getMsg(re.getMsgKey(), re.getMsgParam()));  
  11.         return commonService.getAjaxResult();  
  12.     }  
  13. }   

 这样,spring既可以自动控制事务,应用又可以在需要手动rollback的地方,做特殊处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值