Springboot @事务行为

问题描述 投票:0回答:1

我有一个我不明白的奇怪行为,因为它的行为似乎不像我读过的文档中那样,我正在使用 springboot 3.2.4

我有一个服务类,其方法A标记有springboot @Transactional,并且通过调用实体存储库(witch扩展PagingAndSortingRepository)来保存实体,该方法A调用私有方法B,通过调用实体存储库(witch扩展JpaRepository)保存另一个实体 如果在 methobB 的最后我抛出一个 RuntimeException 来测试事务行为,则数据库中的 2 个插入将被回滚,但我一直认为私有方法不参与事务,在这种情况下,它似乎参与了事务方法A的交易和我不知道为什么??

@服务 公共类 MyService {

    @Transactional
    public void methodA() {
       EntityA entityA = new EntityA();
       entityARepository.save();
       methodB();
    }

    private void methodB() {
       EntityB entityB = new EntityB();
       entityBRepository.save();
       throw new RuntimeException();
    }

}

2个实体的插入被回滚,不仅是EnitytA,还有EntityB

当我放置JpaTransactionManager的日志时,在方法A的开头创建了一个新事务,方法A中对保存的调用参与了已创建的活动事务,方法B中对保存的调用也参与了已创建的活动事务即使方法B是私人的。

spring-boot transactions
1个回答
0
投票

事务注释为对象创建一个“代理”。根据规范,如果应用于私有方法,它不会创建代理。但是,如果创建了代理,它就可以完全访问类字段和方法,无论它们是否私有

© www.soinside.com 2019 - 2024. All rights reserved.