Как спроектировать глобальную распределенную транзакцию (без базы данных)? Может ли JTA использовать транзакцию без БД?

Я думаю, что это довольно распространенный вопрос: как поместить мою бизнес-логику в глобальную транзакцию в среде распределенных систем? Приведите пример, у меня есть TaskA, содержащий пару подзадач:

TaskA {subtask1, subtask2, subtask3 ... }

каждая из этих подзадач может выполняться на локальной или удаленной машине, я надеюсь, что TaskA выполняется в атомарным образом (успех или неудача) посредством транзакции. Каждая подзадача имеет функцию отката, как только TaskA считает, что операция завершилась неудачно (из-за сбоя одной из подзадач), она вызывает каждую функцию отката подзадач. В противном случае TaskA фиксирует всю транзакцию.

Чтобы сделать это, я следую шаблону транзакции «Аудит пробной версии», чтобы иметь запись для каждой подзадачи, поэтому TaskA может знать результаты операций подзадач, а затем принимать решение об откате или фиксации. Это кажется простым, однако сложная часть заключается в том, как связать каждую подзадачу с глобальной транзакцией?

Когда начинается TaskA, она запускает глобальную транзакцию, о которой подзадача ничего не знает. Чтобы подзадача знала об этом, я должен передавать контекст транзакции при каждом вызове подзадачи. Это действительно ужасно! Моя подзадача может либо выполняться в новом потоке, либо выполняться удаленно, отправляя сообщение через брокера AMQP, трудно консолидировать способ распространения контекста.

Я провел некоторые исследования, такие как «Шаблоны транзакций — набор из четырех шаблонов, связанных с транзакциями», «Проверенные транзакции в среде асинхронной передачи сообщений», ни один из них не решает мою проблему. У них либо нет практического примера, либо они не решают проблему распространения контекста.

Интересно, как люди решают это? поскольку такого рода транзакции должны быть распространены в корпоративном программном обеспечении.

Является ли X/Open XA единственным решением для этого? Может ли JTA помочь здесь (я не изучал JTA, так как большинство материалов для него связаны с транзакциями базы данных, и я использую Spring, я не хочу задействовать другой сервер приложений Java EE в своем программном обеспечении).

Кто-нибудь из экспертов может поделиться со мной мыслями? Спасибо.

Заключение

Арьян и Мартин дали очень хорошие ответы, спасибо. В конце концов, я не пошел по этому пути. После дополнительных исследований я выбрал другой шаблон "CheckPoint" 1.

Изучив свое требование, я обнаружил, что мое намерение «Аудит шаблона пробной транзакции» состоит в том, чтобы узнать, на каком уровне была выполнена операция, и если она не удалась, я могу перезапустить ее в неудачной точке после перезагрузки некоторого контекста. На самом деле это не транзакция, она не откатывает другие успешные шаги после неудачи. В этом суть паттерна CheckPoint. Однако, изучая распределенные транзакции, я узнал много интересного. Помимо того, что упомянули Арьян и Мартин. Я также предлагаю людям, копающимся в этой области, взглянуть на CORBA, который является хорошо известным протоколом для распределенной системы.

16
задан Community 3 December 2013 в 16:18
поделиться