Spring事务传播性详解

Spring事务传播性详解

       关于事务传播性,主要是指在父事务中执行子事务时,子事务的表现特征。Spring支持的事务传播性主要有如下几个:

  • REQUIRED:表示当前方法在执行时必须要在某个事务中执行,如果当前方法已经存在于某个事务序列中,那么就继承该事务序列的配置,否则就会新建一个事务供当前方法执行;
  • SUPPORTS:表示当前方法提供对事务的支持,如果没有事务也可以继续执行。也就是说调用当前方法的序列如果存在事务,当前方法就继承该事务,如果不存在事务,当前方法的执行也不会有事务;
  • MANDATORY:表示当前方法的执行必须是在某个事务序列中,如果不是,则会抛出异常,其和REQUIRED不同的是,其不会新建事务供自己执行;
  • REQUIRES_NEW:表示当前方法的执行必须在一个新的事务中执行,无论是否已经存在某个事务序列;
  • NOT_SUPPORTED:表示当前方法的执行不支持事务,如果当前方法在某个事务序列中,那么就会挂起该事务,以保证当前方法的执行不存在事务,待当前方法执行完成后才会继续执行挂起的事务;
  • NEVER:表示当前方法的执行不允许存在事务,如果当前方法在某个事务序列中,则抛出异常;
  • NESTED:表示当前方法的执行将会在一个新建的嵌套事务中执行。

       关于上述几种事务的传播性,这里主要需要说明的是嵌套事务。嵌套事务指的是,在某个事务序列中新建一个子事务执行子事务序列,父事务与子事务是一体的,只要有任意一个子事务失败,整个事务(包括父事务和所有的子事务)都会失败。Spring是使用保存点的方式实现的嵌套事务,所谓的带保存点的事务指的是在进行事务事务处理的时候,可以使用保存点进行部分回滚。比如某个事务S,其中有三个保存点S1、S2和S3,如果在S3之后事务执行失败,那么调用方是可以选择具体回滚到某个保存点的,这种方式就给事务的执行带来了很大的灵活性,因为很多时候整个事务是不需要完全回滚的。这里由于嵌套事务的定义,即某个子事务执行失败,整个事务都必须回滚,因而Spring虽然使用的是保存点的方式实现事务,但其不会只回滚到某个保存点,而是会回滚整个事务。

       在使用方式上,嵌套事务与REQUIRES_NEW是非常相似的,但也有区别。主要原因在于在子事务中抛出异常时子事务与父事务的表现方式是一样的,而父事务中抛出异常时,两者则存在区别。

项目 REQUIRES_NEW NESTED
父事务与子事务的关系 父事务与子事务是两个完全不相关的事务,子事务执行时父事务会被挂起 子事务是父事务的一部分,子事务执行也表示父事务在执行
子事务异常处理 由于异常会向上传递,因而子事务抛出异常会导致子事务和父事务都会回滚;如果前面还存在其他的REQUIRES_NEW类型的子事务,这些已经完成的事务是不会回滚的 由于子事务是父事务的一部分,因而子事务抛出异常,父子事务都会回滚
父事务抛出异常 由于子事务与父事务是两个不同的事务,因而父事务抛出异常不会导致子事务回滚,而只会导致父事务回滚 由于子事务和父事务是一体的,即使子事务已经执行完成,父事务抛出异常父子事务也都会回滚

转载于:https://my.oschina.net/zhangxufeng/blog/1942450

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101451.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux的USB驱动:gadget

    linux的USB驱动:gadget

    2021年9月7日
    113
  • 二分法

    二分法二分法

    2022年4月24日
    48
  • vmware15激活码【2022最新】

    (vmware15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1TCF2R91JZ-eyJsaWNlbnNlSWQi…

    2022年3月31日
    199
  • Nginx配置使用详解

    Nginx配置使用详解详细讲解Nginx的配置文件以及使用

    2022年7月14日
    22
  • 死链处理的详细步骤[通俗易懂]

    死链处理的详细步骤[通俗易懂]死链处理:查找死链;收集死链;提交处理  一:查找死链  1.工具检测,在360极速浏览器的拓展中心下载安装检查网页死链的插件,可以查找当前网页的死链  2.直接点击页面查找死链  3.网站日志分析查找死链,去空间商后台下载IIS。  4.百度站长平台里面有个链接分析,也可以查看  二:收集死链  1.建一个TXT文

    2022年7月22日
    15
  • 将十进制小数转化为二进制小数

    将十进制小数转化为二进制小数小数表示原理你了解小数的表示原理吗?我的十进制小数换成二进制该如何表示?比如:0.3的二进制表示为:0.0100110011001….(小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。0.8125×2=1.625取整1,小数部分是0.6250.625×2=1.25取整1,小数部分是0.250.25×2=0.5取整0,小

    2022年9月24日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号