Spring声明式事务
目标
从事务角度:一个事务方法中包含的多个数据库操作,要么一起提交、要么一起回滚.也就是说事务方法中的多个数据库操作,有任何一个失败,整个事务全部回滚.
从声明式角度:由Spring来全面接管数据库事务.用声明式代替编程式(解耦).
思路
操作步骤
1、导入坐标
<!-- AOP 所需依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <!-- AOP 所需依赖 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> </dependency>
2、修改配置文件
- 配置事务管理器
- 配置AOP
- 配置事务管理器
在spring-mabatis.xml增加配置如下:
<!-- 3配置 MapperScannerConfigurer --> <!-- 把 MyBatis 创建的 Mapper 接口类型的代理对象扫描到 IOC 容器中 --> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 使用 basePackage 属性指定 Mapper 接口所在包 --> <property name="basePackage" value="com.adom.mapper"/> </bean> <!--3配置Spring框架声明式事务管理--> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置AOP增强--> <!-- 配置 AOP --> <aop:config> <!-- 配置切入点表达式 --> <aop:pointcut expression="execution(* *..*Service.*(..))" id="txPointCut"/> <!-- 将事务通知和切入点表达式关联到一起 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config> <!-- 配置事务通知 --> <!-- id 属性用于在 aop:advisor 中引用事务通知 --> <!-- transaction-manager 属性用于引用事务管理器,如果事务管理器的 bean 的 id 正好是 transactionManager,可以省略这个属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- name 属性指定当前要配置的事务方法的方法名 --> <!-- 查询的方法通常设置为只读,便于数据库根据只读属性进行相关性能优化 --> <tx:method name="get*" read-only="true"/> <tx:method name="query*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="count*" read-only="true"/> <!-- 增删改方法另外配置 --> <!-- propagation 属性配置事务方法的传播行为 --> <!-- 默认值:REQUIRED 表示:当前方法必须运行在事务中,如果没有事务,则开 启事务,在自己的事务中运行。如果已经有了已开启的事务,则在当前事务中运行。 有可能 和其他方法共用同一个事务。 --> <!-- 建议值:REQUIRES_NEW 表示:当前方法必须运行在事务中,如果没有事务, 则开启事务,在自己的事务中运行。 和REQUIRED的区别是就算现在已经有了已开启的事务, 也一定要开启自己的事务, 避免和其他方法共用同一个事务。 --> <!-- rollback-for 属性配置回滚的异常 --> <!-- 默认值:运行时异常 --> <!-- 建议值:编译时异常+运行时异常 --> <tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> <tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> </tx:attributes> </tx:advice>