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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何查看python源码_python判断路径是否存在

    如何查看python源码_python判断路径是否存在1.潜在误区2.本质原因及正确查看方法3.总结今天有个新来的实习生让我帮他看个问题,他想通过找到python源码位置来学习官方源码,但是却不幸报错。他想查看的是collections模块中Counter类所处的文件路径,直接使用代码却出现错误AttributeError:typeobject’Counter’hasnoattribute’__file__’。在我的谆谆教导下,不仅帮助他解决了问题,而且通过发现本质更加深入的理解了几个核心概念。

    2022年8月23日
    9
  • aliddns ipv6_利用阿里云ddns动态解析ipv6地址[通俗易懂]

    aliddns ipv6_利用阿里云ddns动态解析ipv6地址[通俗易懂]目前家庭宽带基本都可以通过设置连上ipv6网络,有了ipv6之后,每台设备就都有了自己独有的ip地址,这样我们就可以通过外网利用ipv6地址直接访问家里的设备,让家里的设备实现服务器的效果。但是目前设备分配到的ipv6的地址是变化的,所以你就需要通过一些手段把变化的ipv6地址绑定到不变的域名上,这样就可以直接用域名访问家里的设备了。下面就探讨一下利用阿里云ddns动态解析ipv6地址的方法。一、…

    2022年6月1日
    46
  • 关于GHO文件怎么安装,GHO文件怎么打开等问题解答

    关于GHO文件怎么安装,GHO文件怎么打开等问题解答首先说下GHO文件是什么,GHO文件是用GHOST软件对电脑硬盘中的系统备份生成的文件.我们用一键备份工具备份电脑系统会生成一个GHO文件,另外我们下载的ghost系统中(如雨林深度之类)也有一个GHO文件.1,问:gho文件怎么装系统,怎么安装gho文件. 答:总的来说是通过ghost软件来安装.比如U盘启动工具,网上的什么老毛桃,大白菜,电脑店之类的U盘启动工具都可以来安装,通过

    2022年7月12日
    13
  • 排序 专题讨论

    排序 专题讨论

    2021年10月6日
    33
  • Mysql 查看执行慢的sql语句「建议收藏」

    Mysql 查看执行慢的sql语句

    2022年2月17日
    57
  • BootstrapVue使用入门

    BootstrapVue使用入门网站:https://www.npmjs.com/package/bootstrap-vuehttps://bootstrap-vue.js.org/docs入门开始使用BootstrapVue,它基于世界上最流行的框架-Bootstrapv4,用于使用Vue.js构建响应迅速,移动优先的站点。Vue.jsv2.6是必需的,v2.6.10建议 引导v4.3是必需的,…

    2022年5月25日
    117

发表回复

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

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