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