• Spring事务


    1、什么是事务

      事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

    通俗理解,事务其实就是一系列指令的集合。

    2、事务的四大特性

    • 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
    • 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
    • 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
    • 持久性:当事务正确完成后,它对于数据的改变是永久性的。

    3、事务的实现方式

      4种实现方式:

        a、编程式事务管理

    <!-- 配置事务管理的模板:Spring为了简化事务管理的代码而提供的类 -->

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
    </bean> 

        b、声明式事务管理

          --基于TransactionProxyFactoryBean的方式   
          
    <!-- ==================================2.使用XML配置声明式的事务管理(原始方式)=============================================== -->

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置业务层的代理 -->
    <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 配置目标对象 -->
    <property name="target" ref="accountService"/>
    <!-- 注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager"></property>
    <!-- 注入事务的属性 -->
    <property name="transactionAttributes">
    <props>
    <!--
    prop的格式:
    * PROPAGATION :事务的传播行为
    * ISOTATION :事务的隔离级别
    * readOnly :只读
    * -EXCEPTION :发生哪些异常回滚事务
    * +EXCEPTION :发生哪些异常不回滚事务
    -->
    <prop key="transfer">PROPAGATION_REQUIRED</prop>
    <!-- <prop key="transfer">PROPAGATION_REQUIRED,readOnly</prop> -->
    <!-- <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> -->
    </props>
    </property>   
    c、声明式事务管理
          --基于XML配置声明的方式(基于tx/aop)
      
    <!-- ==================================3.使用XML配置声明式的事务管理,基于tx/aop=============================================== -->

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置事务的通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!--
    propagation :事务传播行为
    isolation :事务的隔离级别
    read-only :只读
    rollback-for:发生哪些异常回滚
    no-rollback-for :发生哪些异常不回滚
    timeout :过期信息
    -->
    <tx:method name="transfer" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>

    <!-- 配置切面 -->
    <aop:config>
    <!-- 配置切入点 -->
    <aop:pointcut expression="execution(* com.testfan.spring.demo3.AccountService+.*(..))" id="pointcut1"/>
    <!-- 配置切面 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
    </aop:config>


      d、
    声明式事务管理
          --基于XML配置声明的方式(基于注解)
          
    <!-- ==================================4.使用注解配置声明式事务============================================ -->

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    3、什么是事务传播 
      
    “事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一
    种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事
    务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新
    的事务。这个工作使由Spring来帮助我们完成的。

    4、什么是事务隔离
    是为了保证数据的一致性
      
     
  • 相关阅读:
    C# 单点登录
    长度12的数组,要求对数据分为3组,每组数据对应位置的数字为前几位的和,并返回12位数组
    react项目初始化
    vue 过滤器的使用(解决forEach遇到的问题)
    nuxt中less使用
    vue项目less 使用
    Webpack中的sourceMap配置
    webpack 同一文件打包两次生成两个文件
    webpack---图片打包前和打包后名称一致的配置
    The computed property "userName" is already defined in data.
  • 原文地址:https://www.cnblogs.com/cristin/p/7749451.html
Copyright © 2020-2023  润新知