Il metodo interno influenzerà il metodo esterno se il metodo interno non è annotato con @Transactional.
Nel caso in cui il metodo interno sia annotato anche con @Transactional con REQUIRES_NEW
, succederà quanto segue.
...
@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!");
}
Il metodo interno viene annotato con REQUIRES_NEW
e genera un'eccezione RuntimeException, quindi imposterà la sua transazione su rollback ma NON EFFETTUERÀ la transazione esterna. La transazione esterna viene IN PAUSA all'avvio della transazione interna e quindi RIPRENDE DOPO la conclusione della transazione interna. Funzionano indipendentemente l'uno dall'altro, quindi la transazione esterna PU essere eseguita correttamente.