Die innere Methode wirkt sich auf die äußere Methode aus, wenn die innere Methode nicht mit @Transactional versehen ist.
Falls die innere Methode auch mit @Transactional with kommentiert ist, geschieht REQUIRES_NEW
Folgendes.
...
@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){
// handle exception
}
}
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
throw new RuntimeException("Rollback this transaction!");
}
Die innere Methode ist mit REQUIRES_NEW
einer RuntimeException versehen und löst eine RuntimeException aus, sodass die Transaktion auf Rollback gesetzt wird, die äußere Transaktion jedoch nicht beeinflusst wird. Die äußere Transaktion wird beim Start der inneren Transaktion PAUSED und nach Abschluss der inneren Transaktion fortgesetzt. Sie werden unabhängig voneinander ausgeführt, sodass die äußere Transaktion möglicherweise erfolgreich festgeschrieben wird.