我有一个我不明白的奇怪行为,因为它的行为似乎不像我读过的文档中那样,我正在使用 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是私人的。
事务注释为对象创建一个“代理”。根据规范,如果应用于私有方法,它不会创建代理。但是,如果创建了代理,它就可以完全访问类字段和方法,无论它们是否私有