Я видел много комментариев в стек переполнения статей я нашел некоторые вещи, о любом @Transactional использования с @Service или @ControllerПочему @Transactional с @Service вместо с @Controller
«Как правило, на сервисный уровень следует отправить транзакцию».
«Нормальный случай будет аннотировать на уровне слоя сервиса»
«Мозговые сделки относятся на уровне сервиса. Это тот, который знает о единицах работы и случаи использования. Это правильный ответ, если вы есть несколько DAO, введенных в Службу, которые должны работать вместе в одной транзакции ». [Source]
Минусом использовать @Transactional с @service слоем
Если у меня было 2 способами, например saveUser() и saveEmail() (потому что я хранить электронную почту в базе данных, чтобы отправить их позже - как очередь), я бы создал в своей службе метод saveUserAndSendEmail (Пользователь пользователя), который был бы транзакционным. [Source]
Это означает, что я создаю много методов в уровне услуг вместо одного Сохранить шаблонный метод, как следовать
public <T> long save(T entity) throws DataAccessException {
Session session = sessionFactory.getCurrentSession();
long getGenVal=(Long) session.save(entity);
return getGenVal;
}
В соответствии с вышеуказанным решением, это означает, что у нас есть много методов, как следующий LOL. .
public <T> long saveAccount(T entity)....
public <T> long saveWithAuditLog(T entity, K entity1)....
public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....
ПРЕОДОЛЕН эту ситуацию
Пользуюсь @Transactional в @Controller и просто сделать Generic Сохранить метод и сохранить все объекты/модель, используя этот простой метод сохранения. и если какой-либо метод не сможет сэкономить, то все транзакции в откате контроллера будут успешными.
Другая ситуация, убедитесь, что @Transactional следует использовать с @Controller
В @Controller:
pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);
В случае, @Transactional на службе, первые 2 объект успешно сохранен, но третий не откат всех транзакций
В случае, @Transactional на @Controller весь tran откат отката в качестве исключения
Почему переполнение стека спрашивает: «Не делайте транзакций в своем контроллере.Поместите их в классах обслуживания слоя. "? [source]
Пожалуйста, не используйте разметку кода для текста. Вы можете использовать кавычки для котировок, если хотите. – Flexo
Я думаю, что лучшим решением в этом случае является создание другого уровня уровня между «контроллером» и «службой». Как я вижу, «контроллер» обрабатывает вызовы и готовит вары для обработки и ведения логики на них. «Сервис» обрабатывает все файлы базы данных. и модель, которая должна находиться между «контроллером» и «службой», может сделать некоторую логику. В вашем примере выполнение нескольких операций сохранения - это логические действия с данными. что означает, что они помещаются в 'model' и warp' model' с 'транзакционным', если необходимо – oak
Ваши методы' saveUser() 'и' saveEmail() 'должны быть в слое DAO. Затем вы создаете метод 'saveUserAndSendEmail (User user)' в транзакционном слое Service. – xli