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