2017-02-03 8 views

ответ

10

Практически ничто в Grails не является транзакционным по умолчанию, за исключением услуг во всех, кроме последних версий 3.1.x. В более старых версиях, если ничего не было настроено для транзакционного поведения, все общедоступные методы были бы транзакционными, потому что был бы применен транзакционный прокси. Вы можете отключить это с помощью static transactional = false или настроить транзакционное поведение с аннотациями @Transactional. Вы можете (и должны) использовать @Transactional аннотации в сервисах - вам просто не нужно отключать автоматическую транзакцию.

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

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

Лучше всего оставить логику привязки данных параметров и логику маршрутизации в контроллерах, но перенести сохранение и бизнес-логику на службы, которые явно сконфигурированы как транзакционные или не зависящие от того, что необходимо для каждого класса и для каждого метода, и контроллеры называют услуги и другие помощники.

В дополнение к тому, что код более удобен для обслуживания (вашими коллегами и будущими вами), этот подход также облегчает правильное тестирование всего, потому что ваши методы и классы более просты и более сфокусированы.