0
点赞
收藏
分享

微信扫一扫

Spring+MyBatis声明事务

一、原则

在之前的开发中,事务代码都是分布在业务代码中,难以重用,调整麻烦。所以,Spring提供了声明事务,将事务代码和业务代码分离,再使用AOP实现,事务代码全部在配置文件中完成。

二、步骤

  1. 再Spring配置文件中导入两个命名空间tx和aop;
  2. 注册事务管理器对象,DataSourceTransactionManager,需要引用数据源组件;
  3. 配置事务增强,绑定事务管理器,并为不同事务业务方法设置具体的事务规则;
  4. 配置事务切面,设置切入点,并将事务增强与切入点关联;

<!--事务管理部分-->

<!--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.可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开

举报

相关推荐

0 条评论