• Spring事务的传播机制


    什么是事务

    事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。

    什么是事务的传播机制

    就是事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。

    什么是事务以非事务性方式运行

    非事务的方式运行,其实就是设置为自动提交了,如果一个方法中有多个操作,则每个操作都会在不同事务中完成,不会保证他们的原子性

    什么是事务挂起

    在方法A开始运行时,系统为它建立Transaction,方法A中对于数据库的处理操作,会在该Transaction的控制之下。 这时,方法A调用方法B,方法A打开的 Transaction将挂起,方法B中任何数据库操作,都不在该Transaction的管理之下。 当方法B返回,方法A继续运行,之前的Transaction回复,后面的数据库操作继续在该Transaction的控制之下 提交或回滚。

    事务的传播机制

    1.REQUIRED:如果有事务则加入事务,如果没有事务,则创建一个新的(默认值)。

    如果当前没有事务,则自己新建一个事务,如果当前存在事务则加入这个事务当A调用B的时候:如果A中没有事务,B中有事务,那么B会新建一个事务;如果A中也有事务、B中也有事务,那么B会加入到A中去,变成一个事务,这时,要么都成功,要么都失败。(假如A中有2个SQL,B中有两个SQL,那么这四个SQL会变成一个SQL,要么都成功,要么都失败)

    2.NOT_SUPPORTED:不为当前方法开启事务,相当于没有Spring事务,每条执行语句单独执行,单独提交。

    以非事务方式执行,如果当前存在事务,则挂起当前事务被调用者B会以非事务方式运行(直接提交),如果当前有事务,也就是A中有事务,A会被挂起(不执行,等待B执行完,返回);A和B出现异常需要回滚,互不影响

    3.REQUIRES_NEW:不管是否存在事务,都创建一个新的事务,原来的方法挂起,新的方法执行完毕后,继续执行老的事务。 老事务报错,老失误回滚,并不影响新事务的提交。

    创建一个新事务,如果存在当前事务,则挂起该事务。B会新建一个事务,A和B事务互不干扰,他们出现问题回滚的时候,也都只回滚自己的事务;

    4.MANDATORY:必须在一个已有的事务中执行,否则报错。报错时,前一个方法中的非事务处理,不回滚。

    当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。如果A中有事务,则B方法的事务加入A事务中,成为一个事务(一起成功,一起失败);如果A中没有事务,B中有事务,那么B就直接抛异常了,意思是B必须要支持回滚的事务中运行

    5.NEVER:必须在一个没有的事务中执行,否则报错。

    如果当前没有事务存在,就以非事务方式执行;如果有,就抛出异常。就是B从不以事务方式运行
    A中不能有事务,如果没有,B就以非事务方式执行,如果A存在事务,那么直接抛异常

    6.SUPPORTS:是否使用事务取决于调用方法是否有事务,如果有则直接用,如果没有则不使用事务。

    当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行如果A中有事务,则B方法的事务加入A事务中,成为一个事务(一起成功,一起失败),如果A中没有事务,那么B就以非事务方式运行(执行完直接提交)

    7.NESTED:如果当前存在事务,则在嵌套事务内执行(当前事务回滚,嵌套事务也回滚;嵌套事务回滚,不影响当前事务)。如果当前没有事务,则执行与REQUIRED类似的操作。

    如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)如果A中没有事务,那么B创建一个事务执行,如果A中也有事务,那么B会会把事务嵌套在里面。

    ____________________________________________________________________________

    NESTED嵌套事务 和REQUIRES_NEW的区别

    REQUIRES_NEw是新建一个事务并且新开启的这个事务与原有事务无关,而NESTED则是当前存在事务时(我们把当前事务称之为父事务)会开启一个嵌套事务(称之为一个子事务)。在NESTED情况下父事务回滚时,子事务也会回滚,而在REQUIRES_NEw情况下,原有事务回滚,不会影响新开启的事务。
    和REQUIRED的区别
    REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一事务,那么被调用方出现异常时,由于共用一个事务,所以无论调用方是否catch其异常,事务都会回滚而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不受影响
     

  • 相关阅读:
    生成式模型和判别式模型
    RocketMQ的push消费方式实现的太聪明了
    c语言:三个数排序(if-else实现)
    Pytorch detach()方法
    【每日3题(3)】符串中不同整数的数目
    C语言问题解决实例1
    Node Package Manager (npm包管理工具 )
    MySQL 入门教程
    flutter sliver 多种滚动组合开发指南
    并发bug之源(一)-可见性
  • 原文地址:https://blog.csdn.net/winerpro/article/details/127947408