Этот вопрос может иметь ответы на многих уровнях.
Общее обсуждение того, что происходит, можно найти здесь
Мое резюме выглядит следующим образом ... Во-первых, где-то должен быть координатор транзакций, контейнер EJBбудет знать о координаторе - обычно это часть сервера приложений.Итак, все, что нужно сделать контейнеру EJB - это вызвать
someobject.BeginTransaction()
.Фактический API, используемый EJB-контейнером: JTA .EJB-компоненты могут фактически использовать транзакцию, управляемую компонентом Bean, или транзакции, управляемые контейнером.В случае Bean Managed исполнитель должен выполнять вызовы JTA.Чаще всего мы используем транзакции, управляемые контейнером (CMT).В этом случае контейнер имеет логику, которая запускается до достижения реализации.Например:
if ( we're not already in a transaction )
begin transaction
call the EJB implementation
и позже у контейнера есть логика
if ( finished processing request )
commit transaction
с другими путями для прерывания транзакции в случае возникновения ошибок.
Теперь эта логика болеесложный, потому что CMT EJBs аннотированы с помощью операторов управления транзакциями.Например, вы можете сказать «если у нас уже есть транзакция, используйте ее». Поэтому, если один EJB вызывает другую, используется только одна транзакция.Для этого ознакомьтесь со спецификацией EJB.
Однако все это довольно очевидно в любой статье EJB Java EE.Поэтому я подозреваю, что вы спрашиваете меня о том, что происходит внутри вызовов JTA, как реализован менеджер транзакций и его связь с менеджерами транзакционных ресурсов (например, Базы данных).Это огромная тема.На самом деле вы приступили к реализации протокола распределенных транзакций XA .Честно говоря, я сомневаюсь, что вам действительно нужно это знать.В какой-то момент вы доверяете используемым API.Однако есть одна ключевая деталь: ваш менеджер транзакций (как правило, сам сервер приложений) должен иметь возможность сообщать менеджерам ресурсов RE о судьбе любой данной транзакции, и эта информация должна сохраняться после перезапуска сервера приложений, следовательно, некоторое постоянное хранилище информации о транзакцияхдолжен быть сохранен.Где-то вы найдете журналы транзакций, и при настройке сервера приложений вам нужно убедиться, что эти журналы хорошо сохраняются.