Этот вопрос проверяет понимание механизма транзакций в Spring и поведения прокси при вызове методов внутри одного класса.
Аннотация @Transactional управляет транзакциями: открывает, коммитит или откатывает их. Если метод без @Transactional вызывает аннотированный метод внутри того же класса напрямую, транзакция не начнётся, так как Spring использует прокси, и внутренние вызовы её обходят.
@Transactional:Открывает транзакцию перед выполнением метода.
Фиксирует изменения (commit) после успешного завершения.
Откатывает (rollback) при исключениях (по умолчанию — RuntimeException и Error).
Использует прокси (обычно через JDK или CGLIB).
Прокси оборачивает вызов метода и добавляет транзакционную логику.
Если метод А вызывает метод B в том же классе, и только B аннотирован @Transactional, тогда:
Вызов происходит напрямую, без прокси.
Аннотация @Transactional не срабатывает.
Транзакция не начинается.
Вынести метод в отдельный бин.
Или вызвать через ApplicationContext.getBean(...).
@Service
public class UserService {
public void outerMethod() {
innerMethod(); // не работает через прокси
}
@Transactional
public void innerMethod() {
// транзакция не начнется
}
}Вывод:
@Transactional работает через прокси, поэтому внутренние вызовы аннотированных методов не активируют транзакцию. Решение — вынос в другой бин или вызов через прокси.