spring事务为什么会出现内部事务

fiy 其他 116

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务可以通过@Transactional注解或编程式事务管理来进行配置和控制。当一个方法中调用了另一个有事务注解的方法时,会出现内部事务。

    出现内部事务的原因主要有以下几点:

    1. 方法嵌套调用:在一个事务方法中,如果调用了另一个有事务注解的方法,那么会将该方法的事务作为内部事务来执行。这样可以保持事务的原子性和隔离性,确保数据的一致性。

    2. 事务传播属性设置:Spring提供了多个事务传播属性(Propagation),如REQUIRED、REQUIRES_NEW等。其中,REQUIRED表示当前方法必须运行在一个事务中,如果已存在事务,则将方法纳入到该事务中作为内部事务执行;如果没有事务,则创建一个新的事务。REQUIRES_NEW则表示每次都创建一个新的事务,不会与外部事务有任何关联。

    3. 异步方法调用:在使用异步调用时,如果在异步方法中存在有事务注解的方法,那么会将该方法的事务作为内部事务来执行。异步方法与外层方法之间不再共享同一个事务,这样可以提高并发性能。

    4. 异常情况下的事务回滚:当一个内部事务发生异常时,如果配置了事务的回滚策略,那么会将内部事务回滚,同时也会影响到外部事务的回滚。

    总结来说,Spring事务出现内部事务的情况主要是由于方法的调用关系以及事务传播属性的配置。通过合理设置事务传播属性,可以灵活控制事务的边界和隔离级别,以满足不同的业务需求。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring事务中出现内部事务是由于在一个事务管理方法内部调用了另一个事务管理方法导致的。这种情况通常在嵌套事务或者使用@Transactional注解的方法内部调用其他带有@Transactional注解的方法时发生。

    以下是一些关于Spring事务出现内部事务的重要信息:

    1. 嵌套事务:在一个事务管理方法内部调用另一个带有@Transactional注解的方法会导致内部事务的出现。这种情况下,外部事务被认为是内部事务的父事务,内部事务成为子事务。子事务的提交或回滚并不会影响父事务,而父事务的提交或回滚会同时提交或回滚子事务。

    2. 事务传播行为:事务传播行为是指在调用事务管理方法时应该如何处理事务。Spring框架提供了不同的事务传播行为选项,其中包括在方法内部创建新事务、加入已有事务、挂起已有事务等。如果在事务管理方法内部调用了另一个事务管理方法且传播行为设置为默认(Propagation.REQUIRED),则内部事务将加入外部事务并在外部事务内执行。

    3. @Transactional注解:在Spring中,可以通过在方法上添加@Transactional注解来定义事务管理方法。当一个带有该注解的方法被调用时,Spring框架会自动创建事务,并在方法执行完成后进行提交或回滚。如果在带有@Transactional注解的方法内部调用了另一个带有@Transactional注解的方法,则内部方法会自动在外部方法的事务管理下执行。

    4. 事务传递对象:Spring框架为事务传递行为提供了TransactionDefinition和TransactionAttribute两个接口。在调用事务管理方法时,会将当前事务的属性传递给被调用的方法。这样,被调用的方法就可以在当前事务下执行,即形成了内部事务。

    5. 内部事务的提交和回滚:内部事务的提交或回滚并不会直接影响外部事务的最终结果。内部事务的提交只是将事务结果保存在内存中,而外部事务的提交才会将所有内部事务的结果一起提交到数据库中。同样,内部事务的回滚不会导致外部事务的回滚,只有外部事务回滚时才会回滚所有嵌套的内部事务。

    总而言之,Spring事务中出现内部事务是因为在一个事务管理方法内部调用了另一个事务管理方法。这种情况下,内部方法会与外部方法形成嵌套事务,并且内部事务的提交或回滚不会直接影响外部事务的最终结果。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在使用Spring框架进行事务管理时,有时会遇到内部事务的问题。内部事务指的是一个事务方法调用了另一个事务方法,导致出现嵌套的事务。为了理解为什么会出现内部事务,我们需要了解Spring事务的一些核心概念以及事务的管理方式。

    1. Spring事务简介
      Spring框架提供了对事务管理的支持,通过对方法或代码块进行封装,可以实现事务的原子性、一致性、隔离性和持久性(ACID)。Spring事务管理采用声明式事务和编程式事务两种方式。

    2. 声明式事务
      声明式事务是通过配置的方式来实现的,使用Spring提供的@Transactional注解来标识需要进行事务管理的方法。在配置文件中,开发人员可以指定事务的传播行为、隔离级别、超时时间等。在方法调用时,Spring会根据配置信息自动管理事务的开始、提交或回滚。

    3. 编程式事务
      编程式事务是通过编写代码的方式来实现的,开发人员直接调用事务管理器的API来控制事务的开始、提交或回滚。这种方式提供了更细粒度的事务控制,但由于需要手动控制事务的边界,代码会显得比较冗长。

    4. 内部事务的原因
      内部事务的出现是因为Spring事务默认采用了基于代理的AOP机制来实现。当一个事务方法调用了另一个事务方法时,如果被调用的方法带有@Transactional注解,Spring会创建一个新的事务,并将其嵌套到当前事务中。

    5. 事务传播行为
      事务的传播行为指的是一个事务方法调用另一个事务方法时,新事务如何与当前事务进行交互。Spring提供了多种传播行为,常用的包括:

    • REQUIRED:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则创建一个新的事务。
    • REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务,将当前事务挂起。
    • NESTED:如果当前存在事务,则在当前事务的嵌套事务中执行;如果当前没有事务,则创建一个新的事务。
    1. 内部事务的影响
      内部事务会导致事务的嵌套,影响事务的传播性。具体表现在:
    • 内部事务的回滚会导致外部事务的回滚。
    • 内部事务的提交不会立即生效,需要等待外部事务的提交才会生效。
    1. 如何解决内部事务问题
      为了解决内部事务问题,我们可以采用以下几种方式:
    • 调整事务的传播行为,使用REQUIRES_NEWNOT_SUPPORTED传播行为来避免嵌套事务的产生。
    • 将内部事务的方法提取成独立的非事务方法,通过AOP来进行事务管理。
    • 在需要进行内部事务的方法上使用propagation=NESTED,而不是propagation=REQUIRED

    总结:内部事务是由于Spring事务管理默认采用了基于代理的AOP机制导致的。通过调整事务的传播行为或者提取独立的非事务方法来避免内部事务的产生。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部