Сделки в Джакарте - Википедия - Jakarta Transactions
В Джакарта Сделки (JTA; ранее Java Transaction API), один из Jakarta EE API, позволяет распределенные транзакции должно быть выполнено через несколько X / Открыть XA ресурсы в Ява среда. JTA была спецификацией, разработанной в Процесс сообщества Java как JSR 907. JTA предусматривает:
- разграничение[требуется разъяснение ] границ сделки
- X / Открыть XA API, позволяющий ресурсам участвовать в транзакциях.
X / Open XA архитектура
В архитектуре X / Open XA менеджер транзакций или монитор обработки транзакций (Монитор TP) координирует транзакции между несколькими ресурсами, такими как базы данных и очереди сообщений. У каждого ресурса есть собственный менеджер ресурсов. Менеджер ресурсов обычно имеет собственный API для управления ресурсом, например JDBC API для работы с реляционными базами данных. Кроме того, диспетчер ресурсов позволяет монитору транзакций координировать распределенную транзакцию между своим собственным и другими диспетчерами ресурсов. Наконец, есть приложение, которое для начала взаимодействует с монитором TP, совершить или же откатиться сделки. Приложение также взаимодействует с отдельными ресурсами, используя свой собственный API для изменения ресурса.
Реализация JTA архитектуры X / Open XA
JTA API состоит из двух классов. Пакеты Java:
JTA смоделирован на архитектуре X / Open XA, но определяет два разных API для разграничения границ транзакций. Он различает сервер приложений например, EJB сервер и компонент приложения. Он предоставляет интерфейс, javax.transaction.TransactionManager
, который используется самим сервером приложений для запуска, фиксации и отката транзакций. Он предоставляет другой интерфейс, javax.transaction.UserTransaction
, который используется общим клиентским кодом, таким как сервлет или EJB, для управления транзакциями.
Архитектура JTA требует, чтобы каждый менеджер ресурсов реализовал javax.transaction.xa.XAResource
интерфейс для управления монитором TP. Как указывалось ранее, каждый ресурс будет иметь свой собственный API, например:
- реляционные базы данных используют JDBC
- службы обмена сообщениями используют JMS
- обобщенная EIS (Информационная система предприятия ) Ресурсы[требуется разъяснение ] использовать API соединителя Java EE.
Интерфейс прикладного программирования
Jakarta Transactions API состоит из трех элементов: интерфейс демаркации транзакций приложений высокого уровня, интерфейс диспетчера транзакций высокого уровня, предназначенный для сервера приложений, и стандартное отображение Java протокола X / Open XA, предназначенное для диспетчера ресурсов транзакций.
Интерфейс UserTransaction
В javax.transaction.UserTransaction
Интерфейс предоставляет приложению возможность программного управления границами транзакций. Этот интерфейс может использоваться клиентскими программами Java или компонентами EJB.
В UserTransaction.begin ()
запускает глобальную транзакцию и связывает транзакцию с вызывающим потоком. Связь транзакции с потоком прозрачно управляется диспетчером транзакций.
Поддержка вложенных транзакций не требуется. Метод UserTransaction.begin вызывает NotSupportedException, когда вызывающий поток уже связан с транзакцией, а реализация диспетчера транзакций не поддерживает вложенные транзакции.
Распространение контекста транзакции между прикладными программами обеспечивается базовыми реализациями диспетчера транзакций на клиентских и серверных машинах. Формат контекста транзакции, используемый для распространения, зависит от протокола и должен согласовываться между хостами клиента и сервера. Например, если диспетчер транзакций является реализацией СТС спецификации, он будет использовать формат распространения контекста транзакции, как указано в спецификации CORBA OTS 1.1. Распространение транзакций прозрачно для прикладных программ.
@Transactional аннотация
В javax.transaction.Transactional
аннотация предоставляет приложению возможность декларативно контролировать границы транзакции. Эту аннотацию можно применить к любому классу, который спецификация Jakarta EE определяет как управляемый компонент (который включает управляемые компоненты CDI).
В приведенном ниже примере кода показано использование @Transactional в управляемом компоненте CDI с областью запроса:
@RequestScopedобщественный учебный класс ExampleBean { @Transactional общественный пустота фу() { // Здесь активна транзакция // Выполнять работу } // После возврата из метода транзакция фиксируется или откатывается}
Транзакционное поведение можно настроить с помощью атрибута в аннотации. Доступные параметры полностью соответствуют параметрам EJB Технические характеристики.
Аннотация @TransactionScoped
В javax.transaction.TransactionScoped
аннотация предоставляет приложению возможность объявить, что область действия, в течение которой существует компонент, привязана к времени, в течение которого данная транзакция активна.
В приведенном ниже примере кода показано использование @TransactionScoped в управляемом компоненте CDI с областью запроса:
@TransactionScopedобщественный учебный класс TxScopedBean { общественный int номер; общественный int getNumber() {возвращаться номер;} общественный пустота setNumber(int номер) {это.номер = номер;}}@RequestScopedобщественный учебный класс ExampleBean { @Inject частный TxScopedBean txScopedBean; @Transactional общественный пустота фу() { txScopedBean.setNumber(1); } @Transactional общественный пустота бар() { Система.из.Распечатать(tXscopedBean.getNumber()); }}
Если метод foo () сначала вызывается в управляемом экземпляре ExampleBean, а затем в методе бар() вызывается, напечатанное число будет 0, а не 1. Это потому, что каждый метод имел свою собственную транзакцию и, следовательно, свой собственный экземпляр TxScopedBean. Номер 1, который был установлен при звонке на foo () поэтому не будет видно во время звонка бар().
Поддержка UserTransaction на сервере EJB
EJB серверы должны поддерживать интерфейс UserTransaction для использования EJBbeans со значением BEAN в javax.ejb.TransactionManagement
аннотация (это называется транзакциями, управляемыми компонентами, или BMT). Интерфейс UserTransaction предоставляется компонентам EJB либо через интерфейс EJBContext с использованием метода getUserTransaction, либо напрямую через внедрение с использованием общего @Ресурс
аннотация. Таким образом, приложение EJB не взаимодействует напрямую с менеджером транзакций для разграничения транзакций; вместо этого компонент EJB полагается на сервер EJB для обеспечения поддержки всей своей транзакционной работы, как определено в Спецификации Jakarta Enterprise Beans. (Базовое взаимодействие между EJBServer и TM прозрачно для приложения; бремя реализации управления транзакциями лежит на контейнере EJB и провайдере сервера.[1])
В приведенном ниже примере кода показано использование UserTransaction через транзакции, управляемые компонентом, в сеансовом компоненте EJB:
@Stateless@TransactionManagement(Фасоль)общественный учебный класс ExampleBean { @Ресурс частный UserTransaction utx; общественный пустота фу() { // запускаем транзакцию utx.начинать(); // Выполнять работу // Зафиксируем utx.совершить(); }}
В качестве альтернативы UserTransaction можно получить из SessionContext:
@Stateless@TransactionManagement(Фасоль)общественный учебный класс ExampleBean { @Ресурс частный SessionContext ctx; общественный пустота фу() { UserTransaction utx = ctx.getUserTransaction(); // запускаем транзакцию utx.начинать(); // Выполнять работу // Зафиксируем utx.совершить(); }}
Обратите внимание, что в приведенном выше примере, если @TransactionManagement (БИН)
аннотация опущена, транзакция JTA автоматически запускается всякий раз, когда foo ()
вызывается и автоматически фиксируется или откатывается, когда foo ()
вышел. Таким образом, использование UserTransaction не обязательно при программировании EJB, но может потребоваться для очень специализированного кода.
Поддержка UserTransaction в JNDI
UserTransaction должен быть доступен в java: comp / UserTransaction
(если в среде установлена реализация JTA).