Spring JdbcTemplate и транзакции

При использовании JdbcTemplate мне нужно явно сконфигурировать транзакции?

Мой макет кода выглядит следующим образом:

У меня будет UserDao, который будет введен в мой UserService, а затем мои контроллеры вызовут методы в моем UserService.

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

По умолчанию мне нужно что-либо делать в моем файле конфигурации или использовать аннотацию @Transaction где-нибудь?

Теперь скажите в моем контроллере, что мне нужно сделать 2 вызова в моем сервисе userService и accountService, могу ли я явно его обернуть транзакцией?

userService.updateUser(user);
accountService.updateXXX(...);

Ответы

Ответ 1

Да, JdbcTemplate не заменяет управление транзакциями. Вы по-прежнему пользуетесь транзакциями базы данных, поэтому userService.updateUser будет работать в транзакции базы данных, но если accountService.updateXXX не работает, userService.updateUser не откатится.

Если вы не хотите использовать AOP, вы можете вместо этого использовать TransactionTemplate. См. программное управление транзакциями в Spring Reference Documentation.

Один шаблон, который я видел ранее, - это класс класса MVC для вызова бизнес-службы, которая инкапсулирует операцию. Затем метод бизнес-класса можно было бы аннотировать @Transactional.

Ответ 2

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

Служба должна обеспечивать функциональность контроллера или того, кто его еще вызывает. Я пытаюсь создать службы с идеей, что служба предоставляет определенные функции, полезные для определенного типа пользователей.