ИМХО транзакции должны идти на сервисный уровень. Обычно одна бизнес-транзакция состоит из нескольких запросов и обновлений. Если вы поместите @Transactional
только на уровень DAO, каждый запрос и обновление будут выполняться в отдельной транзакции, что фактически отрицательно сказывается на назначении транзакций.
Но если сервисами являются @Transactional
, каждое взаимодействие с базой данных объединяет одну основную транзакцию, начинающуюся, когда веб-слой входит в слой служб. Обратите внимание, что в этом случае, если веб-слой запускает несколько сервисных методов, каждый из них будет выполняться в отдельной транзакции (та же проблема смещена на один уровень вверх). Но размещение @Transactional
в веб-слое может привести к неожиданным побочным эффектам, таким как проблема N + 1, которая была бы обнаружена в противном случае. Поэтому попытайтесь сохранить одну бизнес-транзакцию в одном сервисном методе, вызываемом из веб-слоя.