Встречается на собеседованиях • сегодня

Что будет, если вызвать Transactional метод из метода без Transactional в Spring

Если @Transactional метод вызывается из другого метода без аннотации в том же классе, транзакция не начнется. Это происходит из-за работы Spring AOP: проксирование работает только при вызове через прокси-объект, а внутренние вызовы внутри класса обходят его.

Пример:

java
@Service
public class UserService {
    public void nonTransactionalMethod() {
        transactionalMethod(); // Транзакция НЕ создастся!
    }

    @Transactional
    public void transactionalMethod() {
        // Логика с БД
    }
}

Решение:

  1. Вынести @Transactional метод в отдельный сервис.
  2. Использовать self-injection (не рекомендуется):
java
@Autowired
private UserService self; // Инжектим себя

public void nonTransactionalMethod() {
    self.transactionalMethod(); // Теперь транзакция работает
}
  1. Использовать TransactionTemplate программно.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы