Сеансовые компоненты. Введениев Enterprise JavaBeans. Представления EJB и UML. Представление компонентов EnterpriseJavaBeans в UML, страница 7

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

·  begin — указывает, что транзакция начинает работу.

·  commit: — указывает, что транзакция завершилась успешно и должна быть зафикси рована в базе данных.

·  rollback — указывает, что транзакция по каким-то причинам потерпела неудачу и не должна быть зафиксирована. Хорошая функция отката (rollback) должна вернуть объект сеанса в состояние, в котором он был перед началом транзакции.

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

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

Первая разновидность демаркации транзакций носит название демаркации с управлением от компонента. Такие транзакции также называются управляемыми клиентом или управляемыми компонентом. В любом случае, указание этой разновидности в описателе развертывания означает, что клиент сам создаст код обработки транзакции, возможно, с использованием интерфейса javax. transaction.User-Transaction, и выполнит демаркацию, вызвав в нужные моменты функции begin, commit или rollback.

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

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

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

В большинстве случаев для клиента удобнее поручить задачу демаркации контейнеру EJB. Если транзакция управляется контейнером, он сам знает, как и когда вызывать функции begin и commit и когда выполнять необходимые стандартные действия для отката транзакции.

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

В некоторых случаях разработчику EJB может понадобиться, чтобы непосредственно перед началом или сразу после завершения транзакции проводилась какая-то нестандартная обработка. В такой ситуации можно не уходить от режима управления от контейнера, но использовать в то же самое время специальные методы, вызываемые через интерфейс SessionSynchronization.


Интерфейс SessionSynchronization

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

·  af terBegin — вызывается сразу после вызова begin для транзакции, но до начала выполнения делового метода.

·  beforeCompletion — вызывается сразу после вызова commit для транзакции, но до того, как commit фактически начинает работу над транзакцией. Это последний момент, когда сеанс может произвести откат транзакции.

·  afterCompletion — вызывается после вызова commit для транзакции и сразу после окончания его работы над транзакцией. В этом методе возвращается параметр логического типа, который сообщает, была ли на самом деле фиксация транзакции успешной.