首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

了解Spring事务 - 当事务方法调用另一个事务方法时会发生什么?

在Spring事务中,当一个事务方法调用另一个事务方法时,会根据事务的传播行为来确定具体的行为。Spring事务的传播行为定义了事务方法与已存在的事务之间的关系。

常见的事务传播行为包括:

  1. REQUIRED(默认):如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。这意味着内部事务方法会在外部事务的范围内运行,并与外部事务共享同一个事务。
  2. REQUIRES_NEW:无论当前是否存在事务,都会创建一个新的事务。这意味着内部事务方法会挂起当前事务,创建一个新的事务并在其自己的事务范围内运行。
  3. NESTED:如果当前存在事务,则在当前事务的嵌套事务中执行。如果当前没有事务,则行为与REQUIRED相同。嵌套事务是外部事务的一部分,它可以独立于外部事务进行提交或回滚。
  4. SUPPORTS:如果当前存在事务,则加入该事务,如果不存在事务,则以非事务方式执行。这意味着内部事务方法可以选择性地参与到外部事务中,但不会强制要求。
  5. NOT_SUPPORTED:以非事务方式执行,并挂起当前存在的事务(如果有)。这意味着内部事务方法会在没有事务的环境中执行。
  6. NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。这意味着内部事务方法不允许在事务环境中执行。
  7. MANDATORY:如果当前存在事务,则加入该事务,如果不存在事务,则抛出异常。这意味着内部事务方法必须在事务环境中执行。

根据不同的传播行为,事务方法调用另一个事务方法时会有不同的行为。例如,如果外部事务方法使用REQUIRED传播行为,而内部事务方法使用REQUIRES_NEW传播行为,那么内部事务方法会创建一个新的事务,并在自己的事务范围内执行,不受外部事务的影响。

对于Spring事务的具体实现和配置,可以参考腾讯云的云数据库TDSQL产品,它提供了可靠的、高性能的数据库服务,支持事务管理和分布式事务。您可以通过以下链接了解更多信息:

https://cloud.tencent.com/product/tdsql

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring事务与非事务方法相互调用

它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager) 在同一个类中,一个方法调用另外一个有注解...NOT_SUPPORTED b()不创建自己的事务; b()不接受a()的事务,b()先执行 事务不生效的场景 问题一:非事务方法A调用事务方法B,方法B事务不生效 spring默认的是PROPAGATION_REQUIRED....是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!...所以以上就是为什么在没有标注事务注解的方法A里去调用标注有事务注解的方法B而没有事务滚回的原因; 问题二:在事务方法A中调用另外一个事务方法B,被调用方法B的事务没起作用 产生问题的原因是:spring...这种解决方案最简单,不需要了解其他东西,但是这种方案需要修改代码结构,本来两个方法都是属于同一个类的,现在需要强行把它们拆开。 2.

11.3K24

Spring JDBC-事务方法嵌套调用解读

Spring事务传播机制回顾 相互嵌套的服务方法 源码 Spring事务传播机制回顾 关于Spring事务的一个错误的说法:一个事务方法中不应该调用另外一个事务方法,否则将产生两个事务,其实这是不正确的...但是事务的传播行为却是Spring凭借自身的框架提供的功能。 所谓事务传播的行为,就是多个事务方法相互调用时,事务如何在这些方法间传播。...Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法事务方法发生嵌套调用事务如何进行传播: 事务传播行为类型 说明 PROPAGATION_REQUIRED...#method3(),那么这3个服务类的3个方法通过Spring事务传播机制都工作在同一个事务中。..., 然后直接执行udpateTeacherInfo方法,由于doSomething和udpateTeacherInfo在一个类中,没有观察到有事务传播行为的发生, 然而执行到updateSutdent

69040
  • Spring声明式与编程式事务的区别,事务与非事务方法相互调用导致的事务不生效问题

    问题三:同一个类方法调用 在一个Service内部,事务方法之间的嵌套调用,普通方法事务方法之间的嵌套调用,都不会开启新的事务.是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的...这种情况往往是程序员对 Spring事务的 rollbackFor 属性不够了解导致的。...「解决方案」: 这个解决方案要依赖业务而定,你要明确你想要的结果是什么 内部事务发生异常,外部事务 catch 异常后,内部事务自行回滚,不影响外部事务 ❝ 将内部事务的传播级别设置为 nested...但是传播级别为 nested 时,实际上只存在一个事务,只是在调用 a 方法时设置了一个保存点, a 方法回滚时,实际上是回滚到保存点上,并且外部事务提交时,内部事务才会提交,外部事务如果回滚,内部事务会跟着回滚...这样提交事务时会进入下面这段代码 显示回滚 最大的区别在于处理回滚时第二个参数传入的是 false, 这意味着回滚是回滚是预期之中的,所以在处理完回滚后并不会抛出异常。

    1.3K41

    Spring事务回滚的两种方法

    当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。...方法一 使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类...若配置在方法上,则该方法被加上了事务 若配置在类上,则等于给该类的所有方法都加上了该注解。...,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。...} } 复制代码 方法二 通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。

    1.1K10

    java spring事务方法、子方法各自回滚问题处理

    java spring事务方法、子方法各自回滚问题处理 问题描述 service实现类中A方法(父方法调用B方法(子方法),两个方法均开启事务,且事务各自独立,A方法和B方法均可自行回滚且相互之间各不干扰...A方法 注解@Transactional(rollbackFor = Exception.class) 开启A方法事务 其中: goodsService.importData3(); 调用B方法或者采用...SpringUtils.getAopProxy(this).importData3(); 调用B方法均可以,这里try catch B方法异常是为了防止B方法造成的异常影响到A方法的插入 代码如下:...注解@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)开启B方法的新事务,且A方法与...B方法不属于同一个事务 @Override @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW

    25710

    被标记为事务方法互相调用的坑(下)

    上一节,主要分析了 被标记为事务方法互相调用事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些。...解决方案的核心: 通过代理对象去调用方法 1.把方法放到不同的类: 如果想学习Java工程化、高性能及分布式、深入浅出。...可以看到是开了两个事务去执行的。 这种解决方案最简单,不需要了解其他东西,但是这种方案需要修改代码结构,本来两个方法都是属于同一个类的,现在需要强行把它们拆开。 2....此方法不适用于prototype 在这里,我用了一个@PostConstruct注解,在初始化的时候,会调用被@PostConstruct标记的方法(注意,仅仅是初始化的时候,才会被调用。...重写BeanPostProcessor接口: 关于这个接口是做什么的,这里就不详细阐述了,简单的来说这是Spring提供的接口,我们可以通过重写它,在初始化Bean之前或者之后,自定义一些额外的逻辑。

    57720

    被标记为事务方法互相调用的坑(上)

    相信大家一定用过Spring中的注解型事务,配合上Spring Boot,只需要在方法上打一个@Transactional 就可以完成,真香。...下面我就分享下 被标记为事务方法互相调用的坑。 如果想学习Java工程化、高性能及分布式、深入浅出。...看上去一点问题都没有:第一个方法会成功,第二个方法会失败并且回滚。但是仅仅是看上去,当我们运行一下,会发现奇怪的事情发生了: ? 两个方法竟然都成功了!!Why?...,调用了add方法,add方法里面又调用了delete的方法。...这也就是为什么insertCodeMonkey的事务没有被开启的原因了,因为insertCodeMonkey方法是insertCodeBear直接调用的。 那么,这个问题该如何解决呢?

    68810

    关于在Spring方法内部调用自身方法事务 REQUIRE_NEW 不生效的解释

    问题来自:Spring事务的传播行为中REQUIRES_NEW真的有效吗 这个是Spring 对拦截的实现有关。Spring 拦截实现的方法是动态生成一个代理类。...对于有接口实现的类代理,Spring 使用的是 Java 自带的代理生成方式。这种方式对 target.method() 方式的调用是可以拦截到的,对于类内调用 method() 方式则拦截不到。...}); dynamicProxy.a(); } } 执行结果为: invoke in proxy this is a this is b 从这可以看出你类内自行调用方法是不会被代理拦截到的...,因此你使用的事务注解也就不会生效。...针对这种情况通过 threadlocal 的方式暴露了当前类的代理,可以使用 AopContext.currentProxy(); 方式得到,使用获取到的代理类再调用方法就可以再次走事务的处理逻辑了

    1.4K30

    什么private方法加了@Transactional,事务没有生效?

    当你在一个 public 方法上加上 @Transactional 注解时,Spring 会生成一个代理对象,该代理对象负责管理事务。...但是,对于 private 方法,由于其访问权限的限制,Spring 无法生成代理对象,因此事务也无法正常生效。 为什么 private 方法无法生成代理对象?...要理解为什么 private 方法无法生成代理对象,首先需要了解 Spring AOP(面向切面编程)的工作原理。Spring AOP 通过动态代理或字节码增强来实现切面的功能。...当你在一个 public 方法上加上 @Transactional 注解时,Spring 会生成一个代理对象,该代理对象包装了原始对象,并在方法调用前后添加了事务管理的逻辑。...使用反射调用 private 方法 虽然不推荐,但你也可以使用 Java 反射来调用 private 方法,并在该方法上使用 @Transactional 注解。

    1.8K40

    Spring事务传播机制的应用场景和解决方法

    在实际项目中,我们可以使用Spring事务传播机制来管理事务并解决可能遇到的问题。以下是几个常见的场景和解决方法:1....场景:跨服务的事务一致性解决方法:使用分布式事务管理器,如Atomikos、Bitronix等。通过配置分布式事务管理器,在跨多个服务之间的事务操作时保证事务的一致性。...Spring支持通过注解或编程方式进行配置。2. 场景:多个操作需要保证原子性解决方法:使用REQUIRED传播机制,将多个操作放在同一个事务中。这样,如果其中任何一个操作失败,整个事务都将回滚。...场景:某个操作需要独立的事务,不受外部事务的影响解决方法:使用REQUIRES_NEW传播机制,将该操作放在一个新的事务中执行。...以上是在实际项目中应用Spring事务传播机制并解决可能遇到问题的一些常见场景和解决方法。根据具体需求和业务逻辑,可以选择适当的传播机制来管理事务的行为。

    41961

    关于加@Transactional注解的方法之间调用事务是否生效的问题

    不同类之间的方法调用,如类A的方法a()调用类B的方法b(),这种情况事务是正常起作用的。只要方法a()或b()配置了事务,运行中就会开启事务,产生代理。...同一个类内方法调用:重点来了,同一个类内的方法调用就没那么简单了,假定类A的方法a()调用方法b() 同一类内方法调用,无论被调用的b()方法是否配置了事务,此事务在被调用时都将不生效。...另一个例子:方法a()配置了事务,此时b()的事务虽然不生效,但a()的事务生效,对于b()中抛出的异常也会回滚。...有几篇文章探究了事务这个特性的原因,spring声明式事务 同一类内方法调用事务失效 个人理解,从类外调用方法a()时,从spring容器获取到的serviceImpl对象实际是包装好的proxy对象...这里最好研究一下spring aop和事务的源码,应该能搞得更清楚。

    6.7K40

    springboot注解大全注解(spring两个方法都注解事务)

    关系型数据库多用到事务,在传统项目中使用xml配置,配置虽然也还好,但是看着很不美观,在使用SpringBoot框架,就简单的多了,以实战为准,直接上代码 @Transactional spring 事务注解...,否则抛出异常(与Propagation.MANDATORY相反) @Transactional(propagation=Propagation.NEVER) 如果其他bean调用这个方法,在其他bean...1 update(); // 调用其他类的修改方法 otherBean.update(); // 本类的修改方法 2 update...spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional...然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务

    50320

    SpringBoot 内部方法调用事务不起作用的原因及解决办法

    在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。  ...内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。  ...方法一 引入自身bean  在类内部通过@Autowired将本身bean引入,然后通过调用自身bean,从而实现使用AOP代理操作。  ...通过ApplicationContext引入bean  通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。  ...(User user) {  ((UserService) AopContext.currentProxy()).invokeInsertUser(user);  }  以上就是内部方法调用时,事务不起作用的原因及解决办法

    2.1K20

    浅析spring声明式事务使用

    一个事务中有两次或多次相同的查询操作时,第一个查询得到的不存在的记录,第二个查询中却发现被另一个事务插入了,这就是幻读。...4. spring事务的传播行为 业务方法在容器中运行 存在父事务(即事务嵌套) 不存在父事务 REQUIRED 在父事务中运行 自己新建一个事务 SUPPORTS 在父事务中运行 正常执行 MANDATORY...在父事务中运行 抛出异常 REQUIRES_NEW 新建事务,将父事务挂起(suspend) 自己新建事务 NOT_SUPPORTED 如果存在方法调用将父事务挂起,调用结束恢复 不会开启事务 NEVER...下面我们看看在spring源码里面的对应设置: 在执行时确定是否需要新建事务调用获取事务方法org.springframework.transaction.support.AbstractPlatformTransactionManager...、TransactionDefinition.PROPAGATIONNESTED这三种在父事务不存在时会新建事务,最终会进入newTransactionStatus方法

    61820

    谈谈SpringBoot 事件机制

    要“监听”事件,我们总是可以将“监听器”作为事件源中的另一个方法写入事件,但这将使事件源与监听器的逻辑紧密耦合。 对于实际事件,我们比直接方法调用更灵活。...本教程概述了如何发布和侦听自定义事件,并解释了 Spring Boot 的内置事件。 ---- 为什么我应该使用事件而不是直接方法调用? 事件和直接方法调用都适合于不同的情况。...使用方法调用,就像断言一样-无论发送和接收模块的状态如何,他们都需要知道此事件的发生。 对于事件,另一方面,我们只知道发生了一个事件,哪些模块会被通知并不是我们关心的问题。...当我们想要将某些业务处理传递给另一个线程时(例如:在某些任务完成时发送电子邮件),最好使用事件。此外,事件对于测试驱动的开发也很有用。 什么是应用程序事件( Application Events)?...当我们使用@TransactionalEventListener注释方法时,我们将获得一个扩展的事件侦听器,该侦听器可以了解事务: @Component class UserRemovedListener

    2.5K30

    猿蜕变16——一文搞懂Spring事务花式玩法

    曾经学渣很多年的猿人君知道你的记性不是太好,经常学完一个忘记了另一个,如果你不了解事务,或者说看的过程中有不理解的地方,建议你先可以看看猿思考系列6——事务也就那么回事儿,复习下,原理搞懂,使用只是花拳绣腿一般容易...我们再看看Spring事务管理办法。Spring事务管理事务的默认方式:程序发生运行时异常时回滚,程序发生一般性异常时提交。针对一般性的异常,我们也可以手动处理,设置为回滚。...事务的传播行为指的是一段程序中,存在不同事务的相互调用行为时,在程序执行期间Spring对于事务的处理策略。...比如,A 事务中的方法 t1()调用 B 事务中的方法 t2(),在调用执行期间Spring对于事务的处理策略,就称为事务传播行为。事务传播行为是定义在方法上的。...添加在类名上: @Transactional public class TravelRouteServiceImpl implements TravelRouteService { //用在方法上,表示抛出异常时会进行回滚

    44410

    一文搞懂什么事务

    一文搞懂什么事务 一文搞懂什么事务 事务概念 脏读、不可重复读、幻读 数据库事务的隔离级别 Spring事务传播行为 Spring 事务的两种实现 使用事务时需要注意的点 总结 事务概念 我们要理解下事务概念...单位为秒,默认值为-1,当事务超时时会抛出异常,进行回滚操作。...rollbackFor:回滚事务异常类定义,方法中出异常,且异常类和该参数指定的类相同时,进行回滚操作,否则提交事务。...noRollbackFor:指定发生哪些异常不回滚事务方法中出异常,且异常类和该参数指定的类相同时,不回滚而是将继续提交事务。...ACID是什么 ,脏读、不可重复读、幻读 等等术语的介绍及例子 数据库事务的隔离级别(4种), Spring事务传播行为(7种),事务的实现实例和使用事务时需要注意的地方 通过这篇文章,小伙伴们应该已经对事务有了更深的了解

    61230
    领券