Де “@Transactional” має розміщувати рівень послуг або DAO


81

По-перше, можливо, я запитую щось, про що вже запитували і відповідали, але мені не вдалося повернути результат пошуку. Добре загалом (або завжди так далеко :)) Ми визначаємо транзакційні анотації на сервісному рівні, як правило, типовий весняний сплячий режим

Контролер-> Менеджер-> Дао-> Орм.

Зараз у мене ситуація, коли мені потрібно вибрати модель домену на основі клієнтського сайту. Скажімо, клієнт A використовує мою модель домену, все добре, але тоді інший клієнтський сайт надасть мені веб-службу, а не використовуватиме нашу модель домену.

Який шар я повинен замінити. Я вважаю, що це повинен бути DAO, який буде отримувати мені дані з веб-сервісу та відправляти їх назад. Тобто два окремо записані шари DAO та підключаються до мережі відповідно до сценарію.

Зараз я зрозумів, що ми робили щільне зчеплення (якщо таке є або, скажімо, не має вільного зчеплення), коли ми вводимо @Transactionalрівень обслуговування. Так багато мізків не може помилятися або вони є (я сумніваюся).

Тож питання: "Де має бути" @Transactional"розмістити Службовий рівень або DAO?" і чи це рівень обслуговування вниз, я мав би замінити.


6
Це питання насправді є копією найкращої практики Spring @Transactional Annotation .
Pascal Thivent

Відповіді:


81

В ідеалі, рівень обслуговування ( менеджер ) представляє вашу бізнес-логіку, і, отже, він повинен бути анотований @Transactional.

Сервісний рівень може викликати різні DAO для виконання операцій з БД. Припустимо ситуацію, коли у вас є 3 операції DAO методом обслуговування. Якщо ваша перша операція DAO не вдалася, інші дві все ще можуть бути передані, і ви отримаєте невідповідний стан БД. Рівень анотування служб може врятувати вас від таких ситуацій.


Дякуємо за Ваш відповідь. Ви можете вказати рік, у якому ви відповіли? Вірте чи ні, я думаю, ви, можливо, щойно довели існування машини часу. Дав вам +1 у 2015 році.
Шахеб

Я не помітив року, поки ви не запитали :)
Бадал

60

Ви хочете, щоб ваші послуги були транзакційними. Якщо ваші DAO є транзакційними, і ви викликаєте різні DAO в кожній службі, то у вас буде кілька транзакцій, а це не те, що ви хочете. Зробіть виклики служби транзакційними, і всі виклики DAO всередині цих методів будуть брати участь у транзакціях для методу.


6
чи не міг він вказати метод поширення у своїй @Transactionанотації, так що використовується лише 1 транзакція, як вона перелічена тут
Фотіс Параскевопулос

1
@FotisParaskevopoulos Це буде працювати тільки якщо у нього є @Transactionalна обох службі і в DAO. Тоді зайва анотація не зашкодить, але і не допоможе.
William F. Jameson

6

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

найкраща практика - використовувати загальний BasicService для пропонування загальних послуг.

Сервіс є найкращим місцем для розміщення @Transactional, сервісний рівень повинен містити поведінку випадків використання на рівні деталізації для взаємодії користувача, яка логічно переходила б до транзакції. таким чином ми можемо підтримувати розділення між кодом веб-додатків та бізнес-логікою.

Є багато CRUD-додатків, які не мають жодної суттєвої бізнес-логіки, оскільки для них наявність сервісного рівня, який просто передає речі між контролерами та об’єктами доступу до даних, не є корисним. У цих випадках ми можемо розмістити анотацію транзакцій на Dao.

Тож на практиці ви можете розмістити їх у будь-якому місці, це вирішувати вам.

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


0

Це особистий вибір на основі типів додатків, якщо програма розбита на багато модулів і більшість операцій базується на @CRUD, то наявність анотацій @transactional на рівні сервісу робить більше сенсу .. додатки типу двигуна, такі як планувальники, сервери завдань, @ etl повідомляти про програми, де сеансів та концепції користувача не існує, тоді транзакція поширення на контекстному рівні є найбільш підходящою ... ми не повинні в кінцевому підсумку створювати кластерні транзакції, розміщуючи @transactional скрізь, де закінчуються транзакційні анти-скоромовки ... у будь-якому випадку для прагматичної транзакції контроль JTA2 є найбільш підходящою відповіддю ... знову ж таки це залежить від погоди, ви можете використовувати його в певних ситуаціях ...


0

Ви повинні використовувати @Transactional на рівні обслуговування, якщо ви хочете змінити модель домену для клієнта B, де вам потрібно надати однакові дані в іншій моделі, ви можете змінити модель домену, не впливаючи на рівень DAO, надавши іншу послугу або шляхом створення інтерфейсу та реалізації інтерфейсу в іншій моделі та з однією і тією ж службою заповнити модель на основі клієнта. Це рішення ґрунтується на бізнес-вимогах та обсязі проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.