首页 文章

Spring - 带有ScheduledExecutorService的@Transactional - 后台会发生什么?

提问于
浏览
2

我想知道使用ScheduledExecutorService使用@Transactional注释方法时实际发生了什么?

假设在外部调用methodA . 假设在调用methodA时,someDao.methodDao()加入事务并且scheduleMethodB()立即返回,我是否正确 .

稍后2秒,调度程序调用methodB() . 在这种情况下,这会有什么作用?它会保持TransactionProxy并在单独的事务中执行methodB吗?如果没有,那么我们如何才能实现这一目标 .

我知道@Transactional基于代理,因此methodB在调度程序下调用自调用 .

注意:由于此机制基于代理,因此只会拦截通过代理进入的“外部”方法调用 . 这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务!

public class ServiceABImpl implements ServiceAB {

    @Autowired
    private ScheduledExecutorService scheduledExecutorService;

    @Transactional
    public void methodA() {

        //do some work in a transaction.
        someDao.methodDao();

        //schedule a methodB
        scheduleMethodB();


    }

    public void scheduleMethodB() {

        scheduledExecutorService.schedule(() -> {
                    this.methodB();
                    return "";

                },
                2,
                TimeUnit.SECONDS);
    }

    @Transactional
    public void methodB() {


    }

}

1 回答

  • 1

    由于该类未使用@Transactional进行注释,因此决定调用方法是否参与父调用方法的事务取决于您是否使用@Transactional注释调用的方法以及您认为使用它配置的传播级别 . 所以举个例子

    @Transactional(propagation=Propagation.REQUIRED)
    

相关问题