一、原则
在之前的开发中,事务代码都是分布在业务代码中,难以重用,调整麻烦。所以,Spring提供了声明事务,将事务代码和业务代码分离,再使用AOP实现,事务代码全部在配置文件中完成。
二、步骤
- 再Spring配置文件中导入两个命名空间tx和aop;
- 注册事务管理器对象,DataSourceTransactionManager,需要引用数据源组件;
- 配置事务增强,绑定事务管理器,并为不同事务业务方法设置具体的事务规则;
- 配置事务切面,设置切入点,并将事务增强与切入点关联;
<!--事务管理部分-->
<!--1、注册事务管理器对象,DataSourceTransactionManager,需要引用数据源组件-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2、配置事务增强,绑定事务管理器,并为不同事务业务方法设置具体的事务规则-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--3、配置事务切面,设置切入点,并将事务增强与切入点关联-->
<aop:config>
<aop:pointcut id="serviceMethod" expression="execution(* smbms.service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
propagation:事务传播机制
REQUIRED 默认,如果当前事务存在,则既加入到当前事务中,否则创建新的事务;
SUPPORTS:如果当前事务存在,则既加入到当前事务中,否则非事务的方式执行;
MANDATORY 如果当前事务存在,则加入到当前事务中,否则抛出异常
REQUIRES_NEW 创建一个新的事务,如果当前事务存在,则挂起当前事务。挂起操作并不是开箱即用的,只对特定的事务管理器有效
NOT_SUPPORTED 以非事务的方式执行,如果存在当前事务,则挂起当前事务。挂起操作并不是开箱即用的,只对特定的事务管理器有效
NEVER 以非事务的方式执行,如果存在当前事务,则抛出异常
NESTED 如果当前事务存在,则在当前事务中创建一个内嵌的事务。内嵌事务的创建对特定的事务管理器是开箱即用的:工作在JDBC 3.0驱动上的DataSourceTransactionManager
isolation:事务隔离等级
常用值:
DEFAULT(默认)使用数据库的默认事务隔离;
READ_COMMITTED:未提交读;
READ_UNCOMMITTED:提交读;
REPEATABLE_READ:可重复读;
SERIALIZABLE:串行读;
timeout:事务超时时间,允许事务运行的最长时间,以秒为单位,默认值为:-1(表示永不超时)
read-only:事务是否为只读状态,默认为false
rollback-for:设定能够触发回滚的异常类型
PS:1.Spring默认只在输出runtimeException才标识事务的回滚
2.可以通过全限定类名指定需要回滚事务的异常,多个类名用到逗号隔开
no-rollback-for:设定不触发回滚的异常类型
PS:1.Spring默认checkedException不会触发事务回滚
2.可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开
标签:事务,管理器,name,tx,Spring,propagation,当前,MyBatis From: https://blog.51cto.com/u_15907719/6057399