Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Spring транзакции


Автор: wertklop 4.11.2013, 14:44
Всем добрый день.

Имеется ситуация:
метод выполняет расчеты, попутно обращаясь к БД, в результате пишет данные в разные таблицы БД посредством метода save().

Вопрос: есть ли возможность сделать так, чтобы если хотя бы одна запись в БД не прошла, то и остальные предыдущие успешные записи откатились? Подойдет ли @Transactional для метода к моей ситуации?

Автор: Stolzen 4.11.2013, 16:30
Для обращения к БД используете hibernate или что-то другое?

Автор: wertklop 4.11.2013, 20:01
да, hibernate

Автор: Stolzen 4.11.2013, 20:09
Hibernate, если мне не изменяет память, использует паттерн UnitOfWork (там это называется Session). Т.е. все изменения, вносимые в сессию, постепенно накапливаются и попадают в базу только после коммита.

А это значит, что вы должны делать коммит только по успешному завершению сохранения всех данных. Аннотация @Transactional в спринге должна это сделать за вас, если во время выполнения не было выброшено никаких исключений. Следовательно, если по вашему мнению что-то пошло не так, выбрасывайте исключение (не помню правда нужно ли там какое-то особое исключение или любое сойдет), и спринг должен позаботиться обо всем. 


Автор: Farmazon 12.11.2013, 03:39
wertklop, подойдёт, если используешь декларативное управление транзакциями. 

Метод save вызывать не надо, хибернейт сам измененные сущности обновит в базе при успешном завершении транзакции (успешное выход из метода с @Transactional). Чтоб транзакция успешно не завершилась, достаточно выкинуть любое исключение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)