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 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, или 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
.
Назад | Вперёд | Содержание |