Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Управляемые бином транзакции

При разграничении транзакций, управляемых компонентом, код в сессионном компоненте или в компоненте, управляемом сообщениями, явно отмечает границы транзакции. Хотя бины с управляемыми контейнером транзакциями требуют меньше кода, они имеют ограничение: когда метод выполняется, он может быть либо связан с одной транзакцией, либо вообще выполняться без транзакции. Если это ограничение затрудняет кодирование компонента, следует рассмотреть возможность использования транзакций, управляемых компонентом.

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

begin transaction
...
    update table-a
...
    if (condition-x)
   commit transaction
    else if (condition-y)
   update table-b
   commit transaction
    else
   rollback transaction
   begin transaction
   update table-c
   commit transaction

При кодировании управляемой приложением транзакции для сессионных или управляемых сообщениями компонентов необходимо решить, использовать ли Java Database Connectivity или JTA-транзакции. В следующих разделах обсуждаются оба типа транзакций.

Транзакции JTA

JTA, или Java Transaction API, позволяет разграничивать транзакции способом, который не зависит от реализации менеджера транзакций. GlassFish Server реализует менеджер транзакций с сервисом транзакций Java (Java Transaction Service — JTS). Однако программисту не требуется вызывать методы JTS напрямую: он вызывает методы JTA, которые уже вызывают процедуры JTS более низкого уровня.

Транзакция JTA управляются менеджером транзакций Java EE. Возможно, вы захотите использовать транзакцию JTA, поскольку она может охватывать обновления нескольких баз данных от разных поставщиков. Менеджер транзакций конкретной СУБД может не работать с гетерогенными базами данных. Однако менеджер транзакций Java EE имеет одно ограничение: он не поддерживает вложенные транзакции. Другими словами, он не может начать транзакцию для объекта, пока не завершится предыдущая транзакция.

Для разграничения JTA-транзакции вызываются методы begin, commit и rollback интерфейса javax.transaction.UserTransaction.

Возврат без завершения

В сессионном компоненте без сохранения состояния с управляемыми компонентом транзакциями бизнес-метод должен зафиксировать или откатить транзакцию перед возвратом. Однако сессионный компонент с состоянием не имеет этого ограничения.

В сессионном компоненте с состоянием с транзакцией JTA связь между объектом компонента и транзакцией сохраняется при множественных клиентских вызовах. Даже если каждый бизнес-метод, вызванный клиентом, открывает и закрывает соединение с базой данных, связь сохраняется до тех пор, пока объект не завершит транзакцию.

В сессионном компоненте с состоянием с JDBC транзакцией соединение JDBC сохраняет связь между объектом компонента и транзакцией в нескольких вызовах. Если соединение закрыто, связь не сохраняется.

Методы, не разрешённые в управляемых бином транзакциях

Не вызывайте методы getRollbackOnly и setRollbackOnly интерфейса EJBContext в управляемых компонентом транзакциях. Эти методы должны использоваться только в управляемых контейнером транзакциях. Для транзакций, управляемых компонентом, вызывайте методы getStatus и rollback интерфейса UserTransaction.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)