• Spring事务隔离级别、传播机制、实现方式


      Spring时使用AOP来代理事务控制,针对接口和类,所以在同一个service类的两个方法的调用,传播机制不生效。

    一、Spring事务隔离级别

      1. ISOLATION_DEFAULT:  默认的隔离级别,使用数据库默认的事务隔离级别。

      2. ISOLATION_READ_UNCOMMITTED: 未提交读,允许一个事务读取另外一个事务未提交的数据,或造成脏读、幻读、不可重复读。

      3. ISOLATION_COMMITTED: 提交读,保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。防止脏读。

      4. ISOLATION_RETETABLE_READ: 可重复读,可以防止脏读、不可重复读,但是还会造成幻读。

      5. ISOLATION_SERIALIZABLE: 串行事务,事务串行执行,防止脏读、不可重复读、幻读。

    二、Spring事务传播机制--参考链接--

      (需要事务加入)

      1. REQUIRED: 如果当前有事务就加入事务,如果没有事务则创建一个新的。

      2. REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。

      (嵌套事务)

      3. NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果没有事务,相当于REQUIRED。

      (支持,如果有就支持,如果没有就算了)

      4.SUPPORTS: 如果当前存在事务,则加入该事务。如果当前没有事务,则以非事务的方式进行。

      (不支持)

      5. NOT_SUPPORTS: 以非事务方式运行。如果当前有事务,则把当前事务挂起。

      (强制性的,一定要有,没有就抛异常)

      6. MANDATORY:如果当前存在事务,则运行在当前事务中。如果没有事务,则抛出异常。

      (从不,比NOT_SUPPORT更硬,直接异常)

      7. NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务。

    三、实现方式

      1. 声明式事务:@Transactional(propagation = Propagation.REQUIRED)

      2. AOP实现事务

    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dateSource"></property>
    </bean>
    <tx:advice id="stockAdvice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="by*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="MyExepction"/> <tx:method name="select*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"></tx:method> </tx:attributes
    </tx:advice>
    <aop:config> <aop:pointcut id="exAdvice" expression="execution(* *..service.*.*(..))"></aop:pointcut> <aop:advisor advice-ref="stockAdvice" pointcut-ref="exAdvice"></aop:advisor> </aop:config>

      3. 事务代理工程Bean实现事务

    <bean id="tproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="dataSourceTransactionManager"></property>&lt;!&ndash;写的是事务&ndash;&gt;
        <property name="target" ref="byStockService"></property>&lt;!&ndash;要进行事务的类&ndash;&gt;
       <property name="transactionAttributes">
        <props>//key写的是service层要增强的方法 事务的隔离级别,后面逗号后面是异常类,用于回滚数据&ndash;&gt;
              <prop key="ByStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-MyExepction</prop>
          </props>
       </property>
    </bean>
  • 相关阅读:
    8. Java 异常
    9. GUI编程
    生成验证码
    使用response实现文件的下载
    关于小程序的几个坑
    关于redux应用
    关于修改react的启动端口
    react 坑总结
    关于小程序的一些坑的总结
    微信开发者工具 跨域问题
  • 原文地址:https://www.cnblogs.com/qmillet/p/12522613.html
Copyright © 2020-2023  润新知