zoukankan      html  css  js  c++  java
  • Spring事务传播行为

    一、定义

      Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service方法事务最好不要嵌套”的传言。

    二、传播行为的定义

      

    三、传播行为使用总结

      1.PROPAGATION_REQUIRED

      结论:通过这两个方法我们证明了在外围方法未开启事务的情况下Propagation.REQUIRED修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。

      结论:以上试验结果我们证明在外围方法开启事务的情况下Propagation.REQUIRED修饰的内部方法会加入到外围方法的事务中,所有Propagation.REQUIRED修饰的内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚。

      2.PROPAGATION_SUPPORTS

      如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

      3.PROPAGATION_MANDATORY

      如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常

      4,PROPAGATION_REQUIRES_NEW

      结论:通过这两个方法我们证明了在外围方法未开启事务的情况下Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。

      结论:在外围方法开启事务的情况下Propagation.REQUIRES_NEW修饰的内部方法依然会单独开启独立事务,且与外部方法事务也独立,内部方法之间、内部方法和外部方法事务均相互独立,互不干扰。

      5.PROPAGATION_NOT_SUPPORTED

      PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作为事务管理器。

      6.PROPAGATION_NEVER

      总是非事务地执行,如果存在一个活动事务,则抛出异常。

      7.PROPAGATION_NESTED

      这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。 
    需要JDBC 驱动的java.sql.Savepoint类。使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true(属性值默认为false)。

      嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

    四、最终总结

      REQUIRED,REQUIRES_NEW,NESTED异同

      NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚。而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。

      NESTED和REQUIRES_NEW都可以做到内部方法事务回滚而不影响外围方法事务。但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。

  • 相关阅读:
    次短路
    【学习笔记】Git工具clone异常
    【学习笔记】 UOS安装MySQL
    AcWing 327. 玉米田(状态压缩动态规划)
    我发现了个 Python 黑魔法,执行任意代码都会自动念上一段 『平安经』
    redis主从复制-密码问题
    java远程连接服务器端的redis
    组态王历史趋势图的一些问题
    使用 autofac 实现 asp .net core 的属性注入
    从一切皆数据与计算的角度,理解进程与线程
  • 原文地址:https://www.cnblogs.com/fengyan20150508/p/10951626.html
Copyright © 2011-2022 走看看