Вот как эта ситуация может быть теоретически рассмотрена. Сначала вам нужно иметь несколько распределенных диспетчеров транзакций JTA на каждом узле. Один действует как хозяин, другой - как рабы. Мастер согласовывает фиксацию/откат распределенной транзакции с подчиненными. Существуют автономные JTA-реализации, например. JOTM.
Vanilla RMI не поддерживает распространение информации о контексте, такую как идентификатор транзакции операции. Но я думаю, что у RMI есть крючки, чтобы его можно было расширить, чтобы поддержать это. Вы можете посмотреть Carol.
Вам необходимо будет использовать XAResource, чтобы обернуть участников транзакции, чтобы их можно было зачислить в распределенную транзакцию. Мастер должен будет отправить сообщения фиксации/отката на ведомые устройства, которые должны будут использовать XATerminator, чтобы действовать соответствующим образом.
Спецификация JTA - это только распределенная транзакция manager, ведение журнала операций в журнале транзакций должно выполняться серверами. Библиотека существует для управления журналом транзакций, например. HOWL.
Я не думаю, что Spring можно использовать - даже с распределенным менеджером транзакций - сделать это легко. Однажды я попытался использовать RMI с распределенной транзакцией, управляемой автономным клиентом и несколькими подчиненными. Вот об этом blog post. Это было довольно сложно.
Вы можете получить все это бесплатно, если используете сервер приложений Java EE, с IIOP. IIOP поддерживает распространение распределенных транзакций. Клиент может быть application client container, и вы можете контролировать транзакции с помощью UserTransaction. На самом деле это один из редких случаев, когда я думаю, что использование сервера приложений действительно оправдано.
Но это говорит о том, что распределенная транзакция - это сложные вещи, которые могут привести к эвристическим сбоям, таймауту, если один узел умирает, и сложные процедуры восстановления.
Моим последним советом было бы: попытаться найти конструкцию, которая не включает в себя распределенную транзакцию, если это возможно. Это сделает вас намного проще.
Вы можете вдохнуть вдохновение в BPEL compensation mechanism. Возможно, существуют другие подходы к обработке ошибок и надежности, которые могут избежать использования распределенных транзакций.
Благодарим вас за то, что нашли время, чтобы ответить так подробно. –