Ответ 1
Ряд методов развивается, но проблема все еще достаточно режущая, что процесс стандартизации еще не предоставил нам полностью портативное решение.
Вариант один, вы можете сообщить транзакцию веб-сервисов. Это, конечно, предполагает, что у вас есть контроль над ними, хотя в некоторых случаях также возможно использование прокси-сервера, поддерживающего транзакцию для не-транзакционных сервисов.
Протоколы WS-AT и WS-BA являются ведущими стандартами для транзакционных веб-сервисов. К сожалению, они указывают только протокол, а не языковые привязки. Другими словами, на уровне языка программирования нет стандартного API. Для Java ближайшая вещь - JSR-156, но она еще не готова.
Затем возникает проблема: как связать транзакцию EJB (т.е. JTA/XA) с WS. Поскольку модели, используемые протоколами WS-AT и XA, тесно связаны, это может быть достигнуто с помощью протокола-моста. Несколько серверов приложений предоставляют что-то в одиночку. JBoss представил их на JavaOne - см. http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/txbridge/BOF-4182.odp
Обратите внимание, что метод мостового соединения протокола также может использоваться другим способом, чтобы позволить EJB, который использует, например, база данных базы данных XA, которая будет показана как транзакционная веб-служба.
Однако модель блокировки, используемая двумя транзакциями с фиксацией фазы, действительно подходит только для коротких транзакций в одном и том же домене управления. Если ваши услуги будут работать в одном и том же центре обработки данных, вам, вероятно, это поможет. Для более широкого распространения, будь то географический или административный, вы, вероятно, захотите посмотреть WS-BA, протокол транзакций веб-сервисов, специально предназначенный для такого использования.
WS-BA использует основанную на компенсации модель, которую сложнее программировать. Это, по сути, основано на методе, который вы упомянули: эффект методов обслуживания отменяется путем вызова метода компенсации. Это может быть сложно сделать правильно, но JBoss intern сделал довольно приятную структуру аннотаций, которая позволяет вам определять методы компенсации с минимальными усилиями и автоматически запускать их. Это не стандартизировано, но стоит проверить, выбираете ли вы такой подход: http://www.jboss.org/jbosstm/baframework