我想知道使用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 回答
由于该类未使用@Transactional进行注释,因此决定调用方法是否参与父调用方法的事务取决于您是否使用@Transactional注释调用的方法以及您认为使用它配置的传播级别 . 所以举个例子