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