Java:从私有方法调用公共事务方法

里奥莫

我有两节课

public class MyTest {
    @Autowired
    private MyService myService;

    private void test() {
        myService.writeToDb();
    }
}

@Service
public class MyService {
    @Transactional
    public void writeToDb() {
        // do db related stuff
    }
}

我想知道从 MyTest 类调用方法 test() (这是一个私有方法)是否会创建一个事务。

附言

我正在使用 Spring Boot。和 Java 17。

浸信会博韦

无论您是从您内部的公共方法还是私有方法调用另一个对象的方法,它都会起作用,这是一个实现细节。从被调用者的角度来看,它是一样的,它甚至不知道调用者的上下文。

Spring AOP 使用代理模式来处理这些场景。这意味着您不是直接接收一个MyServicebean,而是一个MyServiceSpringCreatedProxy(不是实际名称,在调试模式下检查,您会看到),它实际上是围绕方法处理事务。

因此,只要调用通过 Spring 的代理,@Transactional就会按预期计算。请记住,这并不意味着新事务已打开,这取决于另一个事务是否已经存在以及您的配置。

但是,任何自调用(对公共或私有方法)都不会通过代理,然后@Transactional就无法工作。

@Service
public class MyService {

   // can be private, public or whatever
    public void callRelatedStuff() {
       //self call, no transactional work done
       writeToDb();
    }

    @Transactional
    public void writeToDb() {
        // do db related stuff
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章