Транзакционный: контроллер против сервиса - PullRequest
11 голосов
/ 16 декабря 2010

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

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

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

Ответы [ 2 ]

8 голосов
/ 16 декабря 2010

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

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

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

7 голосов
/ 16 декабря 2010

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

@Transactional(propagation =...)

Редактировать

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...