【发布时间】: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