Я пытаюсь использовать функцию декларативного управления транзакциями, предоставляемую Spring. Я установил весенние конфиги и bean-компоненты, как описано в справочной документации (то есть, включая AOP, пространства имен tx и использование тега <tx:annotation-driven />
), и использую аннотацию @Transactional для метода, который я хочу сделать транзакционным.
Вот как выглядит код:
public interface Worker {
public workOnEvents(List<Events> eventsForACustomer);
}
public class WorkerImpl {
@Transactional
public workOnEvents(List<Events> eventsForACustomer) {
for(Event event : eventsForACustomer) {
// get DAO's based on event types at runtime,
// so we will have different DAO's acting within this loop
DAOFactory.getDAO(event.getType()).persistEvent(event);
}
}
}
Теперь я хочу, чтобы, если какой-либо из DAO в приведенном выше цикле не смог обработать событие, все изменения, внесенные в базу данных другими DAO, которые были добавлены в цикл до этого, должны быть отменены.
Итак, чтобы проверить откат, я взял список некоторых событий, скажем (e1, e2, e3), которые привели бы к сбору DAO, скажем (d1, d2, d3), а затем я намеренно выбрасывал исключение времени выполнения Метод persistEvent DAO d2. Однако результат, который я получаю, заключается в том, что программа завершается без перехода к событию e3 в цикле, не обрабатывая выброшенное исключение. Кроме того, данные, сохраненные DAO d1, не откатываются.
Пожалуйста, дайте мне знать, что я могу здесь делать не так?