stringtranslate.com

Джакартские транзакции

Jakarta Transactions ( JTA ; ранее Java Transaction API ), один из API Jakarta EE , позволяет выполнять распределенные транзакции между несколькими ресурсами X/Open XA в среде Java . JTA была спецификацией, разработанной в рамках Java Community Process как JSR 907. JTA обеспечивает:

Архитектура X/Open XA

В архитектуре X/Open XA менеджер транзакций или монитор обработки транзакций (TP-монитор) координирует транзакции между несколькими ресурсами, такими как базы данных и очереди сообщений. Каждый ресурс имеет свой собственный менеджер ресурсов. Менеджер ресурсов обычно имеет свой собственный API для управления ресурсом, например, JDBC API для работы с реляционными базами данных. Кроме того, менеджер ресурсов позволяет монитору TP координировать распределенную транзакцию между его собственным и другими менеджерами ресурсов. Наконец, есть приложение, которое взаимодействует с монитором TP для начала, фиксации или отката транзакций. Приложение также взаимодействует с отдельными ресурсами, используя их собственный API для изменения ресурса.

Реализация JTA архитектуры X/Open XA

API JTA состоит из классов в двух пакетах Java :

JTA смоделирован на основе архитектуры X/Open XA, но определяет два разных API для разграничения границ транзакций. Он различает сервер приложений, такой как сервер EJB , и компонент приложения. Он предоставляет интерфейс, javax.transaction.TransactionManager, который используется самим сервером приложений для начала, фиксации и отката транзакций. Он предоставляет другой интерфейс, , javax.transaction.UserTransactionкоторый используется общим клиентским кодом, таким как сервлет или EJB, для управления транзакциями.

Архитектура JTA требует, чтобы каждый менеджер ресурсов реализовал javax.transaction.xa.XAResourceинтерфейс для управления монитором TP. Как было сказано ранее, каждый ресурс будет иметь свой собственный API, например:

API

API Jakarta Transactions состоит из трех элементов: высокоуровневого интерфейса разграничения транзакций приложений, высокоуровневого интерфейса менеджера транзакций, предназначенного для сервера приложений, и стандартного сопоставления Java протокола X/Open XA, предназначенного для менеджера транзакционных ресурсов.

Интерфейс UserTransaction

Интерфейс javax.transaction.UserTransactionпредоставляет приложению возможность программно контролировать границы транзакций. Этот интерфейс может использоваться клиентскими программами Java или компонентами EJB.

Метод UserTransaction.begin()запускает глобальную транзакцию и связывает транзакцию с вызывающим потоком. Ассоциация транзакции с потоком управляется прозрачно менеджером транзакций.

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

Распространение контекста транзакции между прикладными программами обеспечивается реализациями базового менеджера транзакций на клиентских и серверных машинах. Формат контекста транзакции, используемый для распространения, зависит от протокола и должен быть согласован между клиентскими и серверными хостами. Например, если менеджер транзакций является реализацией спецификации JTS , он будет использовать формат распространения контекста транзакции, как указано в спецификации CORBA OTS 1.1. Распространение транзакций прозрачно для прикладных программ.

@Транзакционная аннотация

Аннотация javax.transaction.Transactionalпредоставляет приложению возможность декларативно контролировать границы транзакций. Эта аннотация может быть применена к любому классу, который спецификация Jakarta EE определяет как управляемый компонент (включая управляемые компоненты CDI).

Приведенный ниже пример кода иллюстрирует использование @Transactionalуправляемого компонента CDI в области запроса:

@RequestScoped публичный класс ExampleBean {    @Transactional public void foo () { // Здесь активна транзакция // Выполнить работу        } // После того, как метод возвращает транзакцию, она фиксируется или откатывается } 

Поведение транзакций можно настроить с помощью атрибута в аннотации. Доступные параметры точно отражают параметры спецификации EJB .

Аннотация @TransactionScoped

Аннотация javax.transaction.TransactionScopedпредоставляет приложению возможность объявить, что область действия компонента привязана к времени активности данной транзакции.

Приведенный ниже пример кода иллюстрирует использование @TransactionScopedуправляемого компонента CDI в области запроса:

@TransactionScoped public class TxScopedBean { public int number ;       public int getNumber ( ) { return number ;} public void setNumber ( int number ) { this.number = number ; } }           @RequestScoped публичный класс ExampleBean {    @Inject private TxScopedBean txScopedBean ;    @Transactional public void foo () { txScopedBean . setNumber ( 1 ); }       @Transactional public void bar ( ) { System.out.print ( tXscopedBean.getNumber ( ) ) ; } }      

Если метод foo() сначала вызывается на управляемом экземпляре ExampleBean, а затем впоследствии вызывается метод bar() , то выведенное число будет равно 0, а не 1. Это связано с тем, что у каждого метода была своя транзакция и, следовательно, свой экземпляр TxScopedBean. Число 1, установленное во время вызова foo(), поэтому не будет видно во время вызова bar() .

Поддержка UserTransaction на сервере EJB

Серверы EJB должны поддерживать UserTransactionинтерфейс для использования компонентами EJB со значением BEAN в javax.ejb.TransactionManagementаннотации (это называется транзакциями, управляемыми компонентами, или BMT). UserTransactionИнтерфейс предоставляется компонентам EJB либо через EJBContextинтерфейс с использованием getUserTransactionметода, либо напрямую через инъекцию с использованием общей @Resourceаннотации. Таким образом, приложение EJB не взаимодействует с диспетчером транзакций напрямую для разграничения транзакций; вместо этого компонент EJB полагается на сервер EJB для предоставления поддержки всей своей транзакционной работы, как определено в спецификации Jakarta Enterprise Beans. (Базовое взаимодействие между сервером EJB и TM прозрачно для приложения; бремя реализации управления транзакциями лежит на контейнере EJB и поставщике сервера. [1] )

Пример кода ниже иллюстрирует использование UserTransactionуправляемых компонентом транзакций в сеансовом компоненте EJB:

@Stateless @TransactionManagement ( BEAN ) открытый класс ExampleBean {    @Resource частная UserTransaction utx ;    public void foo () { // начать транзакцию utx . begin ();      // Делай работу // Зафиксировать utx . commit (); } }  

В качестве альтернативы UserTransactionможно получить SessionContext:

@Stateless @TransactionManagement ( BEAN ) открытый класс ExampleBean {    @Resource частный SessionContext ctx ;    public void foo ( ) { UserTransaction utx = ctx.getUserTransaction ( ) ;        // начать транзакцию utx . begin ();  // Делай работу // Зафиксировать utx . commit (); } }  

Обратите внимание, что в приведенном выше примере, если @TransactionManagement(BEAN)аннотация опущена, транзакция JTA автоматически запускается при каждом foo()вызове и автоматически фиксируется или откатывается при foo()выходе. Таким образом, использование a UserTransactionне является необходимым в программировании EJB, но может потребоваться для очень специализированного кода.

Поддержка UserTransaction в JNDI

UserTransaction должен быть доступен в java:comp/UserTransaction(если в среде установлена ​​реализация JTA).

Смотрите также

Ссылки

  1. ^ JSR 220: Enterprise JavaBeans, версия 3.0, экспертная группа EJB 3.0, Sun Microsystems, 2006 [ постоянная неработающая ссылка ]

Внешние ссылки