• 声明式事务


    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>

     

     

     

     

     

     

     

  • 相关阅读:
    java 和.net 开发平台的感受(菜鸟级)
    结构体应用统计学生成绩
    实验十 链表
    绘制抛物线(带比例缩放)
    上下三角矩阵的输出
    结构体应用分类与索引
    笔试题之数据库
    动态规划求回文给定字符串,插入字符形成回文
    三行九个点,用4条线段连接(扩展,用3条,用1条)
    名言记录
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/13338725.html
Copyright © 2020-2023  润新知