Metoda wewnętrzna wpłynie na metodę zewnętrzną, jeśli metoda wewnętrzna nie ma adnotacji @Transactional.
W przypadku, gdy metoda wewnętrzna jest również opatrzona adnotacją @Transactional z REQUIRES_NEW
, nastąpi następujące.
...
@Autowired
private TestDAO testDAO;
@Autowired
private SomeBean someBean;
@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
testDAO.insertUser(user);
try{
someBean.innerMethod();
} catch(RuntimeException e){
}
}
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
throw new RuntimeException("Rollback this transaction!");
}
Metoda wewnętrzna jest opatrzona adnotacją REQUIRES_NEW
i zgłasza wyjątek RuntimeException, więc ustawi swoją transakcję na wycofanie, ale NIE WPŁYNIE na transakcję zewnętrzną. Transakcja zewnętrzna jest ZATRZYMYWANA, gdy rozpoczyna się transakcja wewnętrzna, a następnie WZNOWIONA PO zakończeniu transakcji wewnętrznej. Działają niezależnie od siebie, więc transakcja zewnętrzna MOŻE zostać pomyślnie zatwierdzona.