Можно ли над методом рест-контроллера ставить аннотацию @Transactional?

177
01 октября 2018, 09:30

Можно ли над методом рест-контроллера ставить аннотацию @Transactional? Будут ли проблемы, если одновременно по этому URL одновременно будут пытаться получить данные несколько клиентов?

Answer 1

Нельзя, однозначно и бесповоротно. Будут проблемы связанные с обработкой транзакций.

Здесь я укажу некоторые ссылки:

  • Слой использования @Transactional анотации..

Что лучше всего с @Transactional, вы должны положить его, если у вас есть доступ к базе данных.

См. «Понимание реализации декларативной транзакции Spring Framework»

 вы просто аннотируете свои классы аннотацией @Transactional, добавляете в свою конфигурацию строку (`<tx: annotation-driven />`), а

затем ожидаете, что вы поймете, как все это работает.

  • Какой слой использовать для транзакций и сессии Hibernate.

Лучше всего использовать управление транзакциями Spring. Аннотации @Transactional для использования транзакций. На заводе-изготовителе используется LocalSessionFactoryBean. Все бобы управляются весной, поэтому у вас нет забот.

  • Spring Hibernate - различие между CrudRepository и SessionFactory.

Просто вы можете найти описание этих аннотаций на сайте docs Spring.

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

 @Transactional используется для демаркации кода, участвующего в транзакции. Он помещается на классы и методы.
 @Repository используется для определения Spring-компонента, поддерживающего транзакции, его также можно использовать в DI.

Они могут использоваться как в одном классе.

Answer 2

Можно. Никаких технических ограничений для этого нет. Но не нужно, так как это неправильно с точки зрения проектирования архитектуры. Ни контроллеры, ни слой доступа к данным не могут располагать необходимыми знаниями о взаимосвязях данных, в контексте которых имеет смысл транзакции применять. Это прерогатива сервисного слоя, в котором и должна располагаться вся бизнес-логика.

UPDATE: Так как правильность моего ответа ставят под сомнение, придётся его дополнить.

Во-первых, мне приходилось видеть проекты крупных и солидных компаний, в которых на протяжении многих лет транзакции успешно используется именно в web-слое. Во-вторых, первая же ссылка в Google по запросу "spring @transactional @controller" ведёт на большой SO, где люди делятся тем же опытом. Наконец, не может быть более железного аргумента, чем рабочий код. Поэтому я накидал простенький проект и залил его на GitHub - https://github.com/TheDeadOne/spring-transactional-controller-demo.

Answer 3

Можно

Пост процессор, увидев аннотацию @Transactional вокруг аннотированного класса создаст прокси, в котором будут происходить (очень примерно) две вещи

  1. Выполняться beginTransaction() перед аннотированным методом (или перед каждым публичным методом аннотированного класса)
  2. Выполняться .getTransaction().commit() после аннотированного метода (или после каждого публичного метода аннотированного класса)

С точки зрения многопоточности от заворачивания контроллера в прокси ничего не меняется.

Но не нужно

А вот с точки зрения архитектуры это плохая идея. Первая буква в слове SOLID: The Single Responsibility Principle Ответственность контроллера - получить request и попросить кого нибудь его обработать и отправить ответ. Не надо вешать на него дополнительную функциональность.

READ ALSO
FileOutputStream запись в файл

FileOutputStream запись в файл

При записи текста каждый раз создается новый файл "buterbrodtxt"

225
В чем ошибка отображение нужной фразы после проверки метки маркера?

В чем ошибка отображение нужной фразы после проверки метки маркера?

Отображается только одно сообщение "Strips" как при нажатии на маркер с выводом сообщения "Strips", так и у маркера, который должен выводить сообщение...

172
Как определить что ViewPAger достиг края?

Как определить что ViewPAger достиг края?

Мне необходимо однозначно определить, что ViewPager домотан до концаТ

183