O método interno afetará o método externo se o método interno não estiver anotado com @Transactional.
Caso o método interno também seja anotado com @Transactional com REQUIRES_NEW
, o seguinte acontecerá.
...
@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!");
}
O método interno é anotado com REQUIRES_NEW
e lança uma RuntimeException, de forma que definirá sua transação para rollback, mas NÃO EFEITARÁ a transação externa. A transação externa é PAUSADA quando a transação interna é iniciada e, em seguida, RETOMA APÓS a transação interna ser concluída. Eles são executados independentemente um do outro, então a transação externa PODE ser confirmada com sucesso.