📝 Разбираем
Давайте обсудимм одну из самых популярных аннотаций в Spring —
🔍 Как работает
Когда вы помечаете метод
Но тут важно помнить:
🔹
🔹 Вызовы методов внутри одного класса не учитывают
🔹 По умолчанию, транзакция откатывается только при RuntimeException. Если бросить
⚠️ Распространённые ошибки
❌ Аннотация на private методе
Транзакция просто не будет работать, так как Spring AOP не перехватит вызов.
❌ Вызов
Транзакция не создастся, так как вызов происходит без участия Spring Proxy. Решение — выносить такие методы в отдельный бин или использовать
❌ Неправильный rollback
Если в методе выбрасывается
✅ Как избежать проблем?
✔️ Всегда ставьте
✔️ Вызывайте
✔️ Контролируйте rollback через
✔️ Используйте
Кто сталкивался с неожиданным поведением
📲 Мы в MAX
👉@BookJava
@Transactional в Spring: Где Подводные Камни? Давайте обсудимм одну из самых популярных аннотаций в Spring —
@Transactional. Многие знают, что она используется для управления транзакциями, но не все понимают, как она работает под капотом и какие проблемы могут возникнуть. Давайте разбираться! 🔍 Как работает
@Transactional? Когда вы помечаете метод
@Transactional, Spring проксирует этот метод и оборачивает его в транзакцию. Это значит, что до начала метода открывается транзакция, а после — либо коммитится (если нет ошибок), либо откатывается (если есть исключение). Но тут важно помнить:
🔹
@Transactional работает только на public методах (если используется Spring AOP). 🔹 Вызовы методов внутри одного класса не учитывают
@Transactional. Если вызвать метод, аннотированный @Transactional, внутри другого метода того же класса, транзакция не создастся. 🔹 По умолчанию, транзакция откатывается только при RuntimeException. Если бросить
checked-исключение, Spring не откатит транзакцию. ⚠️ Распространённые ошибки
❌ Аннотация на private методе
Транзакция просто не будет работать, так как Spring AOP не перехватит вызов.
❌ Вызов
@Transactional метода внутри того же класса Транзакция не создастся, так как вызов происходит без участия Spring Proxy. Решение — выносить такие методы в отдельный бин или использовать
TransactionTemplate. ❌ Неправильный rollback
Если в методе выбрасывается
checked-исключение, Spring по умолчанию **не откатывает** транзакцию. Чтобы изменить это поведение, нужно явно указать `@Transactional(rollbackFor = Exception.class). ✅ Как избежать проблем?
✔️ Всегда ставьте
@Transactional на публичные методы. ✔️ Вызывайте
@Transactional-методы только через Spring-управляемые бины. ✔️ Контролируйте rollback через
rollbackFor. ✔️ Используйте
propagation = REQUIRES_NEW, если хотите создать новую независимую транзакцию. Кто сталкивался с неожиданным поведением
@Transactional? Давайте обсудим в комментариях! 👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5