Spring Boot中@Transactional公有方法调用私有方法的事务范围问题
问题解答
你的示例中,checkValidPerson私有方法会在updatePerson方法开启的同一事务范围内执行,不会开启新事务。
原因是Spring事务基于动态代理实现:当外部调用PersonService中带@Transactional的公有方法updatePerson时,Spring的代理类会先启动事务,再调用目标对象的updatePerson方法。而在updatePerson内部调用私有方法checkValidPerson时,是直接通过目标对象本身调用,不会经过代理类,因此不会触发新的事务创建,会直接沿用当前已开启的事务上下文。
如果私有方法内包含数据库操作,这些操作也会受当前事务控制——比如updatePerson方法抛出异常时,私有方法里的数据库修改也会随事务一起回滚。
@Autowired PersonService service; @PutMapping("/update-person") public Person updatePerson(@RequestBody Person p) { return service.updatePerson(p); } @Service public class PersonService{ ... @Transactional public Person updatePerson(Person p){ //private method checkValidPerson(p); ... p.setName("SomeName"); ... return p; } private void checkValidPerson(Person p){ //some code }
内容的提问来源于stack exchange,提问作者Ewe
相关产品推荐
相关产品推荐

