Sobes.tech
Назад к вопросам
Senior
4

В каких случаях аннотация @Transactional не отработает?

Компании, где спрашивали
IT OneIT One

Ответ от нейросети

sobes.tech AI

Аннотация @Transactional в Spring не отработает (транзакция не будет применена) в следующих случаях:

  1. Вызов метода с @Transactional внутри того же класса напрямую — Spring использует прокси для управления транзакциями, и вызов метода внутри того же класса не проходит через прокси, поэтому аннотация игнорируется.

  2. Метод не public — по умолчанию Spring применяет транзакции только к public методам.

  3. Конфигурация прокси не настроена или отключена — если Spring не создал прокси для бина, аннотация не сработает.

  4. Исключения, не вызывающие откат — по умолчанию транзакция откатывается только при unchecked исключениях (RuntimeException и Error). Если метод выбрасывает checked исключение, транзакция не откатится, если явно не указано через rollbackFor.

  5. Транзакция уже завершена или отсутствует — если метод вызывается вне контекста транзакции и не настроено создание новой.

  6. Использование @Transactional на методах интерфейса без соответствующей настройки прокси — может привести к тому, что аннотация не сработает.

Пример проблемы с внутренним вызовом:

@Service
public class MyService {

    @Transactional
    public void transactionalMethod() {
        // код
    }

    public void nonTransactionalMethod() {
        transactionalMethod(); // вызов внутри класса — транзакция не сработает
    }
}

Чтобы транзакция сработала, вызов должен идти извне через прокси Spring.