Этап 4 из 10 · ≈ 4 ч

Транзакции в Spring

Основа с Junior

@Transactional, распространение, изоляция, откат и типичные ловушки.

Что важно знать

  • Транзакция работает через прокси — только для внешних вызовов публичных методов.
  • По умолчанию откат только при unchecked-исключениях.
  • readOnly = true — подсказка для оптимизаций.
  • Внешний HTTP-вызов внутри транзакции держит соединение и блокировки.

Критерии освоения

Junior ≈ 4 ч

  • Использует @Transactional на сервисном слое для связанных изменений

Практика. Сделать оформление заказа с резервом товара в одной транзакции и тестом отката.

Middle ≈ 6 ч

  • Объясняет propagation REQUIRED и REQUIRES_NEW и откат при checked-исключениях
  • Находит причины, по которым транзакция не работает — самовызов, private, не тот менеджер
  • Не держит транзакцию во время внешних вызовов

Практика. Записать журнал аудита в отдельной транзакции REQUIRES_NEW так, чтобы он сохранялся при откате основной.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Что происходит при выходе из метода с @Transactional, если исключений не было?Junior

Успешный выход из метода — коммит (если метод начал транзакцию). Исключение по умолчанию откатывает только неконтролируемые (RuntimeException, Error); checked — коммит.

Полный разбор
Как работает @Transactional и почему вызов метода внутри того же класса (self-invocation) может не открыть транзакцию?Middle

@Transactional реализован прокси: вызов снаружи идёт через прокси, который открывает транзакцию и вызывает метод. Вызов this.other() внутри класса идёт мимо прокси — аннотация на other не срабатывает.

Полный разбор
Что делает propagation=REQUIRES_NEW и какой подводный камень с пулом соединений он несёт?Senior

REQUIRES_NEW приостанавливает текущую транзакцию и открывает новую независимую — со своим соединением. На это время поток держит два соединения: при большом параллелизме пул исчерпывается, и всё зависает (дедлок на пуле).

Полный разбор
При каком исключении @Transactional по умолчанию откатывает транзакцию?Middle

По умолчанию откат — на RuntimeException и Error. На checked-исключения транзакция коммитится. Меняется через rollbackFor и noRollbackFor.

Полный разбор
Что реально делает @Transactional(readOnly = true)?Middle

readOnly = true — оптимизация чтения: Hibernate не делает снимков и flush (FlushMode.MANUAL), драйверу передаётся подсказка setReadOnly(true), можно направить на реплику. Это не защита от записи: явный UPDATE может пройти.

Полный разбор
Что означает аббревиатура ACID?Junior

ACID — гарантии транзакции: атомарность (всё или ничего), согласованность (инварианты не нарушаются), изоляция (параллельные транзакции не мешают друг другу), долговечность (подтверждённое переживёт сбой).

Полный разбор
Что делает @Transactional в Spring и где его ставить?Junior

@Transactional на методе бина означает: перед вызовом открыть транзакцию, после успешного выхода — закоммитить, при исключении — откатить. Все операции с базой внутри метода выполняются атомарно: либо все, либо ни одна. Ставят на методы сервисного слоя, где…

Полный разбор
При каких исключениях Spring откатывает транзакцию?Junior

По умолчанию Spring откатывает транзакцию при непроверяемых исключениях (RuntimeException и Error) и коммитит при проверяемых (checked, например IOException). Изменить: rollbackFor = Exception.class или noRollbackFor. Если исключение поймано внутри метода и…

Полный разбор

Разборы темы

← Вся карта «Spring»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования