Главная » Java, JavaBeans » Компоненты EJB и транзакции

0

Основы транзакций, управляемых Компонентом или Контейнером

Говорят, что используется транзакция, управляемая Компонентом (Bean- managed transaction, ВМТ), когда сам Компонент программно задает начало и конец транзакции. Если же компонент доверяет управление своей транзакцией Контейнеру, и Контейнер определяет параметры транзакции на основании инструкций, находящихся в Дескрипторе Поставки, тогда говорят об использовании транзакций, управляемых Контейнером (Container-managed transaction, СМТ). Как правило, эта информация помещается в Дескриптор Поставки Сборщиком Приложений (Application Assembler).

Как stateful, так и stateless Session-Компоненты могут использовать оба вида управлениями транзакциями, но не в одно и то же время. Entity- Компоненты могут использовать только СМТ. Какой вид управления транзакциями использовать для session-Компонента, решает его разработчик.

Компонент EJB может захотеть самостоятельно управлять транзакцией, если нужно начать транзакцию как часть одной операции, а завершить – как часть другой. Тем не менее, такое решение может вызвать проблемы, если произошел вызов метода, начинающего транзакцию, но не вызван метод, который ее завершает.

Следует стремиться использовать транзакции, управляемые Контейнером, хотя возможен и другой способ. Их использование требует написание меньшего количества кода и уменьшает вероятность появления ошибок. Кроме того, Компонент с СМТ проще настраивать и интегрировать с другими Компонентами.

Атрибуты транзакции

•          RequiresNew – этот атрибут используется, когда метод не должен быть сопоставлен с уже существующей транзакцией. Он гарантирует, что Контейнер всегда начинает новую транзакцию.

•          Supports – использование этого атрибута позволяет избежать использования глобальных транзакций. Его следует использовать только тогда, когда метод объекта обращается только к одному транзакционному ресурсу или не использует их вовсе, а также не вызывает другие Компоненты EJB. Работа в таком режиме используется исключительно для повышения производительности приложения, так как позволяет избежать дополнительных расходов, связанных с поддержкой глобальной транзакции. Тем не менее, если этот атрибут установлен, но не существует глобальная транзакция, то при вызове такого метода Контейнер начнет локальную транзакцию, которая будет завершена по окончании вызова метода.

•          NotSupported – этот атрибут также разрешает отказаться от использования глобальных транзакций. Когда он установлен, метод не должен быть включен в глобальную транзакцию. Вместо этого Inprise Контейнер EJB приостанавливает действие глобальной транзакции, а затем при вызове этого метода начинает локальную транзакцию, которая завершается вместе с выполнением этого метода.

•          Mandatory – не рекомендуется использовать этот атрибут. Его поведение очень похоже на поведение атрибута Reguired, но клиент, вызывающий метод, обязан уже иметь контекст транзакции. Если же его не существует, Контейнер возбуждает исключительную ситуацию javax.transaction.TransactionRequiredException. Использование этого атрибута приводит к тому, что Компонент становится менее гибким с точки зрения композиции с другими Компонентами, так как делается предположение о существовании контекста транзакции клиента.

•          Never – не рекомендуется использовать этот атрибут. Если же он используется, Inprise-Контейнер начинает локальную транзакцию при вызове этого метода. Как обычно, локальная транзакция завершается вместе с методом.

При нормальной работе следует использовать только два атрибута – Reguired и RequiresNew. Атрибуты Supports и NotSupported предусмотрены исключительно для достижения максимальной производительности. Атрибуты Mandatory и Never не рекомендуется использовать вследствие их влияния на возможность создавать композиции Компонентов. Кроме того, если Компонент хочет взаимодействовать с транзакцией и реализует интерфейс javax.ejb.SessionSynchronization , тогда Сборщик Приложения или Поставщик могут использовать только атрибуты Reguired, RequiresNew или Mandatory. Эти атрибуты гарантируют, что Контейнер вызывает метод только в контексте глобальной транзакции, что необходимо для выполнения синхронизации.

Локальные и глобальные транзакции

Локальная транзакция – это транзакция, которая управляется Менеджером ресурсов. Глобальной транзакцией называется транзакция, управляемая глобальным Менеджером транзакций в составе ITS Transaction Service.

Границы глобальной транзакции определяются Компонентом с ВМТ путем обращения к методам интерфейса

javax.transaction.UserTransaction. Когда транзакция управляется Контейнером, он использует каждый клиентский вызов для определения границ транзакции. Управление транзакцией происходит в декларативном стиле, в соответствии со значением атрибутов транзакции из Дескриптора Поставки. Атрибуты транзакции также определяют, является транзакция локальной или глобальной.

При определении того, нужно ли использовать локальную или глобальную транзакцию при использовании СМТ, Контейнер руководствуется определенными правилами. В общем случае Контейнер вызывает метод в контексте локальной транзакции после того, как он убедится в отсутствии существования глобальной транзакции. Он также убеждается в том, что не следует начинать новую глобальную транзакцию и что атрибуты транзакции задают режим СМТ. Контейнер автоматически помещает вызовы метода в локальную транзакцию при выполнении одного из следующих условий:

•          Если атрибут транзакции имеет значение NotSupported и Контейнер видит, что необходим доступ к ресурсам базы данных.

•          Если атрибут транзакции установлен в значение Supports и Контейнер определил, что вызов метода происходит не в контексте глобальной транзакции.

•          Если атрибут транзакции установлен в значение Never и Контейнер видит, что необходим доступ к ресурсам базы данных.

Локальные транзакции Inprise-Контейнера EJB характеризуются следующим:

•          Локальные транзакции поддерживают методы setRollbackOnly () и getRollbackOnly() интерфейса javax.ejb.EJBContext.

•          Локальные транзакции поддерживают тайм-ауты для транзакций и для соединений с базами данных.

•          Локальные транзакции имеют преимущества с точки зрения производительности приложений.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии