Разделение транзакции между несколькими компонентами

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

  1. Каким-то образом мы разделяем транзакцию между всеми компонентами. Поэтому, когда компонент получает запрос, сначала проверьте, есть ли какая-либо активная транзакция для этого запроса.

  2. Второй вариант использует один компонент для всех объектов, а все остальные используют его. Когда приходит запрос, мы открываем транзакцию, все компоненты делают свою работу, и когда мы возвращаем ответ, мы проверяем, нет ли какого-либо исключения, в противном случае совершаем откат.

Есть ли другой способ? Или каковы наилучшие методы использования транзакций между многокомпонентной архитектурной системой? Каковы плюсы и минусы использования одного компонента для хранения всей информации об объектах в одной точке? Допустимы любые сообщения, блоги, документация, учебные пособия или книги. Или, если это нормально, вы можете поделиться своими экспериментами.


person sakit    schedule 12.10.2018    source источник


Ответы (1)


Вы хотите внедрить «Распределенные транзакции».

Я рекомендую Spring, если у вас есть приложение Java, поскольку оно поддерживает распределенные транзакции: https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

person Steaton    schedule 12.10.2018
comment
Спасибо за ваш ответ. Но мы хотим сделать это без использования Spring. - person sakit; 12.10.2018
comment
Что вы используете для управления транзакциями в настоящее время? Распределенные транзакции довольно сложны, Spring использует встроенный менеджер транзакций Atomikos или Bitronix, поэтому вы можете попробовать использовать то же самое, что Spring делает самостоятельно. Из интереса, почему вы хотите избежать весны? - person Steaton; 12.10.2018
comment
мы используем по умолчанию (JTA) - person sakit; 12.10.2018