2013-07-31 3 views
2

Я читал о том, что TransactionAttributeType.REQUIREDнужны разъяснения относительно атрибута Transaction

Если клиент работает внутри транзакции и вызывает метод корпоративного компонента, метод выполняется в транзакции клиента. Если клиент не связан с транзакцией, контейнер запускает новую транзакцию перед запуском метода.

Клиент представляет собой приложение EJB развернут на сервере А, и вызывает метод methodB другого компонента, который развернут на другом сервере B в пределах транзакции. Если methodB имеет TransactionAttributeType.REQUIRED, он будет работать под той же транзакцией, что и клиентское приложение. Правильно?

Если да, то как приложение, развернутое на разных серверах, знает о транзакции, запущенной на другом сервере?

Если нет, то как methodB использовать эту же транзакцию?

Я немного новичок в EJB, поэтому, пожалуйста, пройдите ко мне. Любые указатели в правильном направлении будут высоко оценены.

ответ

1

Если клиент на сервере A начал транзакцию, контекст транзакции распространяется на компонент, аннотированный TransactionAttributeType.REQUIRED. Это часть вызова.

Таким образом, ответ на ваш первый вопрос: да methodB на сервере B, вызываемом приложением EJB на сервере A, выполняется в той же транзакции. Конечный commit или rollback управляется клиентом, запущенным на сервере A.

Клиент на сервере A также может заручиться другими ресурсами XA в той же транзакции: например, он записывает в источник данных XA и отправляет сообщение используя XA JMS. Затем commit по транзакции сохраняет изменения, вызванные methodB, он будет записывать строку в базу данных, и сообщение находится в очереди. Если клиент делает rollback, все единицы работы откатываются (и ничего не изменилось).

Связанные: Two-phase commit protocol (Wikipedia)

Смежные вопросы