У меня есть класс @Service, в котором есть метод @Transactional, который вызывает другой метод @Transactional того же класса. Я тестировал откат для этого и обнаружил, что он не работает должным образом. Код выглядит примерно так:
@Service
public class DefaulService implements ervice
{
@Transactional
public void methodOne()
{
methodTwo();
//question edited
//this seems to be the problem
this.serviceDAO.executeUpdateOperation();
//test rollback
throw new RuntimeException();
}
@Transactional
public void methodTwo()
{
//DAO stuff
}
}
После запуска methodOne я проверяю базу данных и обнаруживаю изменения, хотя в журнале указано «JDBCTransaction - откат».
Если я вызываю methodTwo по отдельности и добавляю исключение в конце, изменения откатываются правильно.
Есть ли способ заставить methodOne должным образом откатить изменения, произошедшие во время вложенного вызова @Transactional? У меня создалось впечатление, что стандартное распространение REQUIRED достигнет этого, но, похоже, это не работает. Спасибо
ОБНОВЛЕНИЕ
Хорошо, я заметил кое-что еще. Прямо перед выбросом исключения я вызываю службу dao и выполняю обновление вручную с помощью executeUpdate. Если я прокомментирую эту строку, вложенный откат работает. Таким образом, похоже, что проблема на самом деле заключается в вызове DAO и выполнении запроса executeUpdate. Но разве это не должно выполняться внутри текущей транзакции?