牧场SZShepherd 2020-07-19
从事务角度:一个事务方法中包含的多个数据库操作,要么一起提交、要么一起回滚.也就是说事务方法中的多个数据库操作,有任何一个失败,整个事务全部回滚.
从声明式角度:由Spring来全面接管数据库事务.用声明式代替编程式(解耦).

<!-- AOP 所需依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!-- AOP 所需依赖 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>在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>