篇四:SpringMVC tx配置

一、概览

  tx配置俗称事务配置,主要用于数据持久化。一个业务的处理有事需要与数据层交互多次,中间任何一个步骤出现异常,都会导致整个业务的执行失败,为了确保数据的准确性,把一个业务放在一个事务里面,同一事务里面的数据请求操作能够正常执行,只是不会提交,只有事务在没有异常的情况下处理完,tx就会统一提交数据操作,进行数据持久化。

 

二、tx基础

  1、所需jar包

<dependency>                  
  <groupId>org.springframework</groupId>   <artifactId>spring-jdbc</artifactId>
  <version>${org.springframework.version}</version> </dependency> <dependency>
  <groupId>org.springframework</groupId>   <artifactId>spring-tx</artifactId>
  <version>${org.springframework.version}</version> </dependency>

  2、tx配置项说明

属性是否需要?默认值描述
name  

与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。如:'get*''handle*''on*Event'等等。

propagation REQUIRED 事务传播行为
isolation DEFAULT 事务隔离级别
timeout -1 事务超时的时间(以秒为单位)
read-only false 事务是否只读?(增删改设为false,读设为true)
rollback-for  

将被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'

no-rollback-for  

 被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'

  3、传播属性值

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

 

三、注解配置tx:在执行事务的方法上面添加注解@Transaction

  <!--======= 事务配置 Begin ================= -->
    <!-- 事务管理器(由Spring管理MyBatis的事务) -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 关联数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    <!--======= 事务配置 End =================== -->

  例子

@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
@Transactional(readOnly=true) //只读
@Transactional(timeout=30) //默认是30秒
@Transactional(propagation=Propagation.REQUIRED) //配置传播

 

四、使用AOP实现事务

  通过AOP

    <!-- 定义事务管理器 -->  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
    <!-- 下面使用aop切面的方式来实现 -->  
    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <!--配置事务传播性,隔离级别以及超时回滚等问题 -->  
        <tx:attributes>  
       <tx:method name="find*" timeout="25" read-only="true" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
       <tx:method name="delete*" timeout="25" read-only="false" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
       <tx:method name="update*" timeout="25" read-only="false" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
       <tx:method name="insert*" timeout="25" read-only="false" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
       <tx:method name="common*" timeout="25" read-only="false" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
        </tx:attributes>  
    </tx:advice>  
    <aop:config>  
        <!--配置事务切点 -->  
        <aop:pointcut id="services" expression="execution(* com.website.service.*.*(..))" />  
        <aop:advisor pointcut-ref="services" advice-ref="txAdvice" />  
    </aop:config> 

 

 

 

posted @ 2017-01-10 14:48  刘广平  阅读(867)  评论(0)    收藏  举报