首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

spring+aop治理事务

2013-08-13 
spring+aop管理事务spring+aop管理事务的配置方法?1.注册事务管理器(c3p0的配置参考以前的文章)!-- 事务

spring+aop管理事务

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

?

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

<!-- 事务管理器 --><bean name="transactionManager"ref="c3p0"></property></bean>

?

2.配置advice

<!-- 配置事务特性 --><tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="delete*" propagation="REQUIRED" read-only="false"rollback-for="java.lang.Exception" /><tx:method name="insert*" propagation="REQUIRED" read-only="false"rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED" read-only="false"rollback-for="java.lang.Exception" /><tx:method name="save*" propagation="REQUIRED" read-only="false"rollback-for="java.lang.Exception" /><tx:method name="*" propagation="SUPPORTS" read-only="true" /></tx:attributes></tx:advice>

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

?

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

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

?

3.配置aop切面

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

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

?

?

4.手动rollback特殊处理

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

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

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

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

解决方法:

a)定义特殊的RollbackException类

public class RollbackException extends Exception {}

?

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

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

?

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

    @RequestMapping("saveBatchRemark")    @ResponseBody    public Map<String, Object> saveBatchRemark(@RequestBody Map<String, Object> ajaxParam) throws Exception {    IBean bean = this.getAjaxBean(ajaxParam);    try{    // 插入批量备注    return batchRemarkService.insertBatchRemark(bean);    } catch (RollbackException re) {            // 这里是 rollback 后的处理    commonService.setAjaxFailMsg(commonService.getMsg(re.getMsgKey(), re.getMsgParam()));            return commonService.getAjaxResult();        }    } 

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

?

?

?

热点排行