Java && Management
2 subscribers
4 photos
1 link
Для senior Java-разработчиков, архитекторов и тимлидов: JVM, архитектура, эксплуатация и инженерное управление. Первичные источники, актуальные релизы и выводы для решений.

Автор — Андрей Овчаренко. Технический аудит: https://krot.name/
Download Telegram
Транзакция должна заканчиваться раньше сети

Транзакция сохраняет инвариант: изменение фиксируется целиком либо не фиксируется. Проблема начинается на границе базы, HTTP и broker.

По Spring Framework, @Transactional действует только в границе TransactionManager; HTTP и обычная отправка в broker туда не входят.

Три детали, которые ломают уверенность:
— self-invocation в proxy mode не перехватывается;
— checked exception по умолчанию не вызывает rollback;
— PostgreSQL принимает 4 названия isolation level, но реализует 3 режима: READ UNCOMMITTED работает как READ COMMITTED.

В READ COMMITTED каждый SELECT начинает новый snapshot. По документации PostgreSQL serialization failure — SQLSTATE 40001, deadlock — 40P01; повторять нужно всю транзакцию.

Для DB + broker данные и outbox фиксируются вместе. Debezium connector читает изменения через CDC, а Event Router преобразует запись перед публикацией. Дубликаты возможны, поэтому consumer остаётся идемпотентным.

#Java #Spring #транзакции