篇四: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 |
是 |
与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。如: |
|
propagation |
不 | REQUIRED | 事务传播行为 |
isolation |
不 | DEFAULT | 事务隔离级别 |
timeout |
不 | -1 | 事务超时的时间(以秒为单位) |
read-only |
不 | false | 事务是否只读?(增删改设为false,读设为true) |
rollback-for |
不 |
将被触发进行回滚的 |
|
no-rollback-for |
不 |
不 被触发进行回滚的 |
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>

浙公网安备 33010602011771号