Я думаю, что это довольно распространенный вопрос: как разместить мою бизнес-логику в глобальной транзакции в среде распределенных систем? Приведите пример, у меня есть TaskA, содержащий пары подзадач:
TaskA {subtask1, subtask2, subtask3...}
каждая из этих подзадач может выполняться на локальном компьютере или удаленном, надеюсь, TaskA выполняется атомным способом (успех или неудача) посредством транзакции. Каждая подзадача имеет функцию отката, как только TaskA считает, что операция завершается неудачно (поскольку одна из подзадач не работает), она вызывает каждую функцию отката подзадач. В противном случае TaskA совершает всю транзакцию.
Чтобы сделать это, я следую за шаблоном транзакции "Audit trial", чтобы иметь запись для каждой подзадачи, поэтому TaskA может узнать результаты работы подзадач, а затем решить откат или фиксацию. Это звучит просто, но сложная часть заключается в том, как связать каждую подзадачу с глобальной транзакцией?
Когда TaskA начинается, он запускает глобальную транзакцию о том, какая подзадача ничего не знает. Чтобы подзадача знала об этом, я должен передать контекст транзакции для каждого вызова подзадачи. Это действительно ужасно! Моя подзадача может либо выполняться в новом потоке, либо выполнять на удаленном компьютере, отправив сообщение через посредника AMQP, трудно консолидировать способ распространения контекста.
Я сделал несколько исследований, таких как "Шаблоны транзакций - сборка четырех связанных с транзакциями шаблонов", "Проверенные транзакции в среде переноса асинхронных сообщений", ни одна из них не решила мою проблему. Они либо не имеют практического примера, либо не решают проблему распространения контекста.
Интересно, как люди это решают? так как такая сделка должна быть распространена в корпоративном программном обеспечении.
Является ли X/Open XA только решением для этого? Может ли JTA помочь здесь (я не рассматривал JTA, поскольку большинство материалов для нее связано с транзакцией базы данных, и я использую Spring, я не хочу привлекать другой сервер приложений Java EE в свое программное обеспечение).
Может ли какой-нибудь эксперт поделиться со мной некоторыми мыслями? спасибо.
Заключение
Аржан и Мартин дали действительно хорошие ответы, спасибо. Наконец, я не пошел таким путем. После большего исследования я выбрал еще один шаблон " CheckPoint" 1.
В моем требовании я обнаружил, что намерен "Audit Trial Transaction Pattern" - узнать, на каком уровне выполнялась операция, если он не удался, я могу перезапустить его в неудавшемся месте после перезагрузки некоторого контекста. На самом деле это не транзакция, она не откат других успешных шагов после сбоя. Это суть шаблона CheckPoint. Однако изучение материалов распределенной транзакции заставляет меня узнать много интересного. Кроме того, о чем говорили Арьян и Мартин. Я также предлагаю людям, копающимся в этой области, взглянуть на CORBA, который является широко известным протоколом для распределенной системы.