Транзакция должна заканчиваться раньше сети
Транзакция сохраняет инвариант: изменение фиксируется целиком либо не фиксируется. Проблема начинается на границе базы, 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 #транзакции
Транзакция сохраняет инвариант: изменение фиксируется целиком либо не фиксируется. Проблема начинается на границе базы, 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 #транзакции