Поддержка глобальных транзакций в клиентских приложениях

Для управления транзакциями в приложении платформа Java™ EE позволяет использовать как программный, так и декларативный подход к разграничению транзакций.

В программном подходе транзакция управляется компонентами (или объектами), а в декларативном - контейнером.

Транзакции, управляемые компонентами (или объектами)

Приложение Java EE использует интерфейс транзакций Java API (JTA) javax.transaction.UserTransaction для разграничения транзакции на ряд изменений в защищенных ресурсах программным путем. Транзакции, управляемые компонентами, можно использовать как в среде сервлета, так и в среде EJB. Если используется компонент EJB, для атрибута транзакции в файле описания необходимо задать TX_BEAN_MANAGED.

Обычно транзакция начинается с вызова UserTransaction.begin(). Когда компонент приложения готов зафиксировать изменения, он вызывает метод UserTransaction.commit() для согласования и фиксации изменений. Если компоненту приложения необходимо выполнить откат транзакции, он вызывает метод UserTransaction.rollback() для отмены всех изменений. Пример:

    // Получить пользовательскую транзакцию
    javax.transaction.UserTransaction transaction =
    ejbcontext.getUserTransaction();

    // Запустить транзакцию
    transaction.begin();

    // Внести изменения в защищенные ресурсы.
    // Например, с помощью интерфейса взаимодействия Java EE или JCA
    // отправить изменения в системы EIS
    interaction.execute(interactionSpec, input, output);

    if (/* decide to commit */) {
    // зафиксировать транзакцию
    transaction.commit();

    } else { /* если необходим откат */
    // откатить транзакцию
    transaction.rollback();
    }

Транзакции, управляемые контейнерами

Транзакции, управляемые контейнером, можно использовать только в среде EJB. В среде EJB используется декларативный подход для описания транзакции, управляемой контейнером. Для этой цели настраивается атрибут транзакции в файле описания (например, TX_REQUIRED). Обработкой такой транзакции управляет контейнер EJB. Контейнер вызывает соответствующие методы (например, begin, commit или rollback) от имени компонента среды EJB. Подобный декларативный подход упрощает программные вызовы в компоненте среды EJB.


Комментарии