声明式事务

牧场SZShepherd 2020-07-19

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>

相关推荐