Страницы

Поиск по вопросам

пятница, 28 февраля 2020 г.

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

#java #spring #транзакции #jta


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


Ответы

Ответ 1



Нельзя, однозначно и бесповоротно. Будут проблемы связанные с обработкой транзакций. Здесь я укажу некоторые ссылки: Слой использования @Transactional анотации.. Что лучше всего с @Transactional, вы должны положить его, если у вас есть доступ к базе данных. См. «Понимание реализации декларативной транзакции Spring Framework» вы просто аннотируете свои классы аннотацией @Transactional, добавляете в свою конфигурацию строку (``), а затем ожидаете, что вы поймете, как все это работает. Какой слой использовать для транзакций и сессии Hibernate. Лучше всего использовать управление транзакциями Spring. Аннотации @Transactional для использования транзакций. На заводе-изготовителе используется LocalSessionFactoryBean. Все бобы управляются весной, поэтому у вас нет забот. Spring Hibernate - различие между CrudRepository и SessionFactory. Просто вы можете найти описание этих аннотаций на сайте docs Spring. В ближайшее время, чтобы ответить на ваши вопросы, разница между ними заключается в том, что они используются для разных целей. @Transactional используется для демаркации кода, участвующего в транзакции. Он помещается на классы и методы. @Repository используется для определения Spring-компонента, поддерживающего транзакции, его также можно использовать в DI. Они могут использоваться как в одном классе.

Ответ 2



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

Ответ 3



Можно Пост процессор, увидев аннотацию @Transactional вокруг аннотированного класса создаст прокси, в котором будут происходить (очень примерно) две вещи Выполняться beginTransaction() перед аннотированным методом (или перед каждым публичным методом аннотированного класса) Выполняться .getTransaction().commit() после аннотированного метода (или после каждого публичного метода аннотированного класса) С точки зрения многопоточности от заворачивания контроллера в прокси ничего не меняется. Но не нужно А вот с точки зрения архитектуры это плохая идея. Первая буква в слове SOLID: The Single Responsibility Principle Ответственность контроллера - получить request и попросить кого нибудь его обработать и отправить ответ. Не надо вешать на него дополнительную функциональность.

Комментариев нет:

Отправить комментарий