Транзакция: контроллер и обслуживание

У меня есть метод контроллера get(), который вызывает несколько методов обслуживания, работающих с базой данных.

Правильно ли сделать весь метод контроллера транзакционным или только для каждого метода службы?

Мне кажется, что мы должны сделать get() транзакционным, потому что он выполняет связанные операции.

Спасибо!

Ответ 1

Я предпочитаю делать только транзакционные методы службы, которые должны быть транзакционными и контролировать транзакцию в службе, а не в контроллере. Вы можете создать метод службы, который использует другие методы обслуживания и транзакцию spring управлять транзакцией с распространением в аннотации @Transactional.

@Transactional(propagation =...)

Edit

Если у меня было 2 метода, например saveUser() и saveEmail() (потому что я хранил электронные письма в базе данных для их отправки позже - как очередь), я бы создал в своей службе метод saveUserAndSendEmail (Пользователь пользователя), который бы быть транзакционным. Этот метод будет вызывать saveUser и saveEmail() каждый из компонентов @Repository, потому что они имеют дело с базой данных. Поэтому я бы поставил их в компонентах @Repository методы обработки с базой данных, а затем я контролирую транзакцию в компоненте @Service. Тогда диспетчеру нужно будет только беспокоиться о предоставлении данных и вызовах, когда они понадобятся. Но я делаю транзакцию, потому что я не хочу фиксировать изменения в базе данных до тех пор, пока весь метод не будет успешно выполнен.

Но это стиль, который я обычно использую, я не говорю, что это должен быть путь.

Ответ 2

Это полностью зависит от вас и как вы интерпретируете свою собственную бизнес-логику.

Spring действительно не заботится о том, где вы помещаете границы транзакций, и, конечно же, не ограничивает вас помещением их на классы DAO.

Итак, да, добавление @Transactional к вашим методам контроллера вполне допустимо.