Мы разрабатываем программу Java, которая имеет множество независимых компонентов (скажем, A, B, C, D). Мы используем фреймворк Hibernate для отображения базы данных. Некоторые из них работают над одним и тем же процессом JVM, а некоторые — над другим процессом JVM. Все эти компоненты имеют конечные точки REST и имеют собственный файл карты объектов. Каждый из этих компонентов общается друг с другом через TCP. Существует некоторая бизнес-логика, которая требует, чтобы некоторые из этих компонентов работали вместе. И проблема начинается отсюда. Допустим, вызывается компонент А. A запускает новую транзакцию и изменяет некоторые данные в базе данных, затем вызывает компонент B. Когда компонент B принимает запрос, он открывает новую транзакцию и изменяет некоторую информацию в базе данных и фиксирует ее. После окончания своей работы возвращаем результат компоненту А. Компонент А снова начинает делать какие-то операции, но не получается и откатывает все сделанные изменения и возвращает ответ обратно. Но изменения, которые сделал компонент B, все еще там. Это небольшая иллюстрация нашей программы. Что нам нужно, как лучше всего справиться с этим?
Каким-то образом мы разделяем транзакцию между всеми компонентами. Поэтому, когда компонент получает запрос, сначала проверьте, есть ли какая-либо активная транзакция для этого запроса.
Второй вариант использует один компонент для всех объектов, а все остальные используют его. Когда приходит запрос, мы открываем транзакцию, все компоненты делают свою работу, и когда мы возвращаем ответ, мы проверяем, нет ли какого-либо исключения, в противном случае совершаем откат.
Есть ли другой способ? Или каковы наилучшие методы использования транзакций между многокомпонентной архитектурной системой? Каковы плюсы и минусы использования одного компонента для хранения всей информации об объектах в одной точке? Допустимы любые сообщения, блоги, документация, учебные пособия или книги. Или, если это нормально, вы можете поделиться своими экспериментами.