Почему нельзя выполнять часть транзакции в другом потоке?
Транзакция в Spring привязана к потоку.
Другой поток не видит транзакционный контекст.
В новом потоке будет создана новая транзакция или её не будет вовсе.
Это нарушает атомарность операций.
Такое поведение может привести к неконсистентным данным.
Попытка «разделить» транзакцию между потоками приводит к логическим ошибкам.
Spring хранит информацию о транзакции в ThreadLocal.
При создании нового потока:
ThreadLocal не копируется
контекст транзакции теряется
@Transactional
public void process() {
saveA();
new Thread(this::saveB).start();
}
Результат:
saveA() — в транзакции
saveB() — вне транзакции или в новой
commit и rollback не синхронизированы
часть данных может сохраниться, часть — нет
нарушается принцип атомарности
выполнять всю транзакцию в одном потоке
использовать асинхронность после commit
выносить асинхронную логику в отдельные транзакции
Транзакции Spring не поддерживают распределение по потокам, и это фундаментальное ограничение модели.