Возможно, вы угадали ответ на свой вопрос из ответов выше. Внутренний метод повлияет на внешний метод, если внутренний метод не аннотирован @ Transactional.
Если внутренний метод также помечен @Transactional с REQUIRES_NEW
, произойдет следующее.
...
@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!");
}
Внутренний метод помечается REQUIRES_NEW
и выдает исключение RuntimeException, поэтому он устанавливает откат транзакции, но НЕ ВЛИЯЕТ на внешнюю транзакцию. Внешняя транзакция приостанавливается, когда начинается внутренняя транзакция, а затем возобновляет ПОСЛЕ того, как внутренняя транзакция завершается. Они выполняются независимо друг от друга, поэтому внешняя транзакция МОЖЕТ успешно зафиксироваться.