Что происходит при выходе из метода с @Transactional, если исключений не было?
- Когда @Transactional коммитит?
Успешный выход из метода — коммит (если метод начал транзакцию). Исключение по умолчанию откатывает только неконтролируемые (RuntimeException, Error); checked — коммит.
- Если транзакцию начал внешний метод, коммит произойдёт при выходе из него
- rollbackFor — откат и на checked
- Работает только при вызове через прокси
А ещё Перед коммитом Hibernate делает flush изменений
Подробно
Границей транзакции служит вызов метода: прокси открывает её перед входом и завершает после выхода. Важная деталь умолчания, которую любят спрашивать: откат происходит при RuntimeException и Error, а вот проверяемое исключение транзакцию не откатывает — если это нужно, поведение задают параметром rollbackFor. Вторая деталь: перехват работает только для внешних вызовов, поэтому обращение к методу изнутри того же класса транзакцию не откроет вовсе.
Что хотят услышать
- Коммит при успешном выходе.
- Правило отката.
Частые ошибки
- Ожидать отката при проверяемом исключении.
- Ловить исключение внутри транзакционного метода и тем самым отменять откат.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Транзакция откатывается для безопасности, если не было явного commit
- ✗Транзакция остаётся открытой до завершения HTTP-запроса и коммитится фильтром
- ✗Изменения сохраняются только после явного вызова flush в конце метода
- ✓Транзакция фиксируется (commit), изменения видны другим
Что спросят дальше
- Как заставить откат срабатывать на проверяемое исключение?
- Почему вызов метода изнутри класса не открывает транзакцию?
Разбор темы
- @Transactional: propagation, isolation, rollback
Декларативные транзакции через прокси, ловушка self-invocation, уровни распространения, правила отката и readOnly/isolation.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.