Что проверяет вопрос про фазы @TransactionalEventListener
Аннотация публикует событие не сразу, а привязанное к жизненному циклу транзакции. У неё четыре фазы: BEFORE_COMMIT, AFTER_COMMIT, AFTER_ROLLBACK, AFTER_COMPLETION. По умолчанию — AFTER_COMMIT.
Вопрос проверяет, понимает ли кандидат разницу между «событие внутри транзакции» и «событие после того, как транзакция реально закоммитилась». Это частый способ отправить сообщение в Kafka только тогда, когда данные точно сохранены в БД — без отдельного outbox-механизма.
AFTER_ROLLBACK и AFTER_COMPLETION нужны для side-эффектов на неудачный исход: инвалидировать кэш, отправить алерт, залогировать откат. AFTER_COMPLETION срабатывает в обоих случаях — и коммит, и роллбэк.
@TransactionalEventListener( phase = TransactionPhase.AFTER_COMMIT ) public void onOrderCreated( OrderCreatedEvent event) { kafkaTemplate.send( "orders", event.orderId() ); }
Ловушка: если метод вызывается вне активной транзакции — обработчик с фазой AFTER_COMMIT просто не выполнится, без ошибки. Нужен fallbackExecution = true, если событие должно сработать и без транзакции. Спросят и про порядок между несколькими listener'ами на одной фазе — Spring его не гарантирует, только через @Order.
AFTER_COMMIT не защищает от сбоя самого listener'а — транзакция уже закоммичена, откатывать нечего, ошибку обрабатываем отдельно.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки