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


相关推荐

  • winscp登录主机拒绝_winscp连接被拒绝怎么解决[通俗易懂]

    winscp登录主机拒绝_winscp连接被拒绝怎么解决[通俗易懂]解决方法:1、使用“sudoufwdisable”命令关闭防火墙;2、使用“sudo/etc/init.d/sshrestart”命令开启远程服务;3、打开22端口号。本教程操作环境:RedHatEnterpriseLinux6.1系统、DellG3电脑。winscp连接被拒绝可以尝试以下方法:1)开启|关闭防火墙(这里需要关闭)sudoufwenable|disable2…

    2022年9月17日
    0
  • Java–foreach循环

    Java–foreach循环Java foreach 循环 foreach 是 Java5 新增 在遍历数组 集合的时候有不错的性能 foreach 的语法格式 for 元素类型每次循环的元素名称 循环对象 一 常见的使用方式 nbsp nbsp nbsp nbsp 1 遍历数组 publicstatic String args String

    2025年6月7日
    0
  • spring整合log4j_log4j2异步日志配置

    spring整合log4j_log4j2异步日志配置常用日志框架log4j、log4j2(log4j的升级版,最常用的)、logback(spring boot默认)、Jboss-logging…等slf4 是日志接口规范,代码对接slf4,实现和具体日志框架解耦,无需修改编码即可切换日志框架。修改pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st

    2022年8月9日
    4
  • Response.Flush()的用处

    Response.Flush()的用处Response.Flush()的作用是将缓冲信息输出到页面。比如我们在点击一个按钮后,执行多个任务,每个任务执行成功后都有一个Response.Write(‘成功信息’)。如果我们在Respons

    2022年7月2日
    22
  • wordpress自定义搜索

    wordpress自定义搜索默认下,wordpress的搜索范围只有文章的标题和文章内容,无法搜索自定义字段中的内容,现实情况是很多情况下我们可能会要搜索自定义字段中的内容。如果只是想搜索一到两个自定义字段中的内容,可以使用wordpress的内置函数meta_query变量。12345678910111213141516171

    2022年7月14日
    68
  • 中国石化java待遇_中国石化JAVA软件工程师面试:首先,上午进行面试人员签到 – 职朋职业圈…「建议收藏」

    中国石化java待遇_中国石化JAVA软件工程师面试:首先,上午进行面试人员签到 – 职朋职业圈…「建议收藏」为了帮助职业圈网友能够及时了解中国石化的面试流程以及面试过程所涉及的面试问题,职业圈小编把刚获得的中国石化面试经验马上编辑好,快速提供给大家,以便能够尽快帮助到有需要的人。这次面试总共花了0.5天。面试形式包括群面。面试过程首先,上午进行面试人员签到,大约100人左右。一共要2个人。下午1点半开始统一面试。人员较多,所以每个人只有3分钟时间,一共最少8位面试官。过程中,他们很少提问题,如果你的技…

    2022年10月15日
    0

发表回复

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

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