【问题标题】:Spring - @Transactional with ScheduledExecutorService - What happens in background?Spring - @Transactional 与 ScheduledExecutorService - 在后台会发生什么?
【发布时间】:2016-02-14 14:18:09
【问题描述】:

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

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

2 秒后,调度程序调用方法 B()。在这种情况下会发生什么?它会持有 TransactionProxy 并在单独的事务中执行 methodB 吗?如果没有,那我们怎么能做到这一点。

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

注意:由于此机制是基于代理的,因此只有“外部”方法 通过代理传入的呼叫将被拦截。这意味着 'self-invocation',即目标对象中的一个方法调用一些 目标对象的其他方法,不会导致实际事务 在运行时,即使调用的方法标有@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() {


    }

}

【问题讨论】:

    标签: spring spring-transactions transactional scheduledexecutorservice


    【解决方案1】:

    由于类没有使用@Transactional注解,被调用的方法是否参与父被调用方法的事务取决于你是否也用@Transactional注解被调用的方法,以及你用什么传播级别配置它思考。比如

    @Transactional(propagation=Propagation.REQUIRED)
    

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多