我也有这样的情况
@Component
@Slf4j
public class MainClass {
@Autowired
private SomeService service;
@Autowired
private OtherService otherService;
@Transactional
private Object save() {
List<Object> objects = processSomething();
return otherService.save(objects);
}
private List<Object> processSomething() {
return service.doSomething();
}
}
@Service
@Transactional
@Slf4j
public class SomeService {
@Autowired
private SomeService service;
public Object doSomething() {
List<Object> objects = List.of(new Object());
doSomethingAfterCommit();
return objects;
}
private void doSomethingAfterCommit() {
if (!TransactionSynchronizationManager.isActualTransactionActive()) return;
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() { // triggered before otherService.save() call
// some db operations to find records saved in otherService.save()
}
});
}
}
@Service
@Transactional
@Slf4j
public class OtherService {
public Object save(List<Object> objects) {
// db operations to save all entities and returns one
}
}
我很困惑为什么在 OtherService 的 save 方法启动之前就调用 doSomethingAfterCommit 中的 afterCommit 。根据我设置事务注释的方式,我认为所有数据库操作都将成为同一事务的一部分,因此 afterCommit 将在 MainClass.save() 结束时调用。为什么没有发生?