Вопрос о xa и транзакции в ejbs

#websphere #ejb #jboss7.x #java-ee-6 #java-ee-5

#websphere #ejb #jboss7.x #java-ee-6 #java-ee-5

Вопрос:

У меня есть два вопроса / сомнения:

  1. Если два ejbs развернуты на разных ear или разных applicationserver, и один вызывает другой, им все равно требуется независимый XA, чтобы каждый из них использовал одну или несколько БД как?
  2. если два ejb развернуты на разных серверах, оба помечены trans type = required , и когда первый ejb вызывает второй, запускается новая транзакция или используется распространение первого ejb?

** Мои ejb развернуты на Webpshere, Jboss, WebLogic и могут быть написаны с использованием технологии JEE 5/6/7 (EJB 2/3).

Спасибо

Роберто

Ответ №1:

Независимо от того, как упакованы EJBS (тот же или другой EAR) или где они развернуты (тот же или другой сервер), если тип транзакции Required (т. Е. По умолчанию), Тогда транзакция, инициированная первым компонентом, должна передаваться второму компоненту, или вызов второго компонента должен привести кошибка.

Поставщик сервера не должен иметь никакого значения, поскольку поведение определено в главе «Транзакции» спецификации EJB. Однако, если вызов выполняется между поставщиками, то может быть более вероятно, что распространение контекста транзакции не поддерживается, и в этом случае вызов второго компонента должен быть отклонен с исключением.

В принципе, если клиент (1-й компонент) выполняется в транзакции и вызывает второй компонент с «Требуется», то контекст транзакции должен распространяться на второй компонент или приводить к ошибке.

Комментарии:

1. 1) что вы имеете в виду под поставщиком? 2) когда контекст транзакции может не поддерживаться (пример)? Спасибо

2. 1) Поставщик — это поставщик сервера приложений, такой как Webpshere, Jboss, WebLogic, Open Liberty и т. Д. 2) Open Liberty может быть примером того, когда распространение контекста транзакции не поддерживается. Например, если клиент является сервером Glassfish, и клиент начинает транзакцию, а затем вызывает удаленный EJB на сервере Open Liberty, тогда контекст транзакции не будет распространяться, и если требуется метод EJB, то будет выдано исключение. Если клиент не начнет транзакцию, вызов метода будет работать нормально, и сервер просто начнет новую.

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

4. хорошо, я понимаю, у меня последний вопрос: использование транзакции, управляемой контейнером, типа «Supports» для второго удаленного ejb может решить проблему выброса исключений, если они не распространяются? Большое вам спасибо

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