Если я получаю доступ к UserTransaction, означает ли это, что я использую двухфазную фиксацию или XA? - PullRequest
2 голосов
/ 10 марта 2010

UserTransaction ut = lookup .... ut.beginTransaction (); saveToFooDB (); statelessEjb.transactionSupportedMethod (); // что-то сохраняет в Foo DB saveToFooDB (); ut.commit ();

Если я делал вышеупомянутое, то я понимаю, что это не транзакция XA, поскольку она не охватывает несколько ресурсов (например, DB плюс JMS). Правильно ли мое понимание?

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Источник данных может быть настроен двух типов:

  • XA : эти источники данных могут участвовать в распределенных транзакциях
  • Локальный : также называется не-XA, они не могут участвовать в распределенной транзакции

UserTransaction определено в спецификации JTA, которая описывает, как координировать участника в распределенной транзакции.

Однако сервер приложений, который реализует спецификацию JTA, может выполнять множество оптимизаций. Одним из них является last-agent-optimization, который позволяет последнему участнику распределенной транзакции быть Local . Затем выполняется регулярный коммит для последних участников. Если есть только один участник, то это всегда так.

Короче говоря:

  • если у вас более одного участника, необходимо использовать XA и двухфазную фиксацию
  • если есть только один участник, большинство серверов приложений поддерживают локальный источник данных и не используют полнофункциональный протокол двухфазной фиксации.

Для Glassfish см .:

EDIT

Пункт "объем транзакций" Glassfish Документация объясняет это лучше меня. Я думаю, это одинаково для всех серверов приложений.

Локальная транзакция включает только одну не-XA ресурс и требует, чтобы все участвующие компоненты приложения выполнить в течение одного процесса. Местное оптимизация транзакций является специфической к менеджеру ресурсов и прозрачный для Java EE применение.

На сервере приложений, JDBC ресурс не-XA, если он соответствует любому из следующие критерии:

  • В конфигурации пула соединений JDBC класс DataSource не реализует Интерфейс javax.sql.XADataSource.

  • Поле Global Transaction Support не отмечено или Ресурс не установлен Настройка типа не существует или не существует установить в javax.sql.XADataSource.

Транзакция остается локальной, если выполняются следующие условия:

  • Используется один и только один не-XA ресурс. Если какой-либо дополнительный не-XA ресурс используется, транзакция прерванный.
  • Не выполняется импорт или экспорт транзакций.

Транзакции, которые включают несколько ресурсы или несколько участников процессы распределены или глобальны сделки. Глобальная транзакция может привлекать один не-XA ресурс, если последний Оптимизация агента включена. В противном случае все ресурсы должны быть XA. Оптимизация использования последнего агента свойство установлено в true по умолчанию. Подробнее о том, как установить это см. Настройка Сервис транзакций.

Если только один ресурс XA используется в транзакция, происходит однофазное принятие, в противном случае транзакция координируется с двухэтапной фиксацией протокол.

0 голосов
/ 29 июля 2011

Как только вы запускаете UserTransaction, а затем получаете соединение с ресурсом (например, базами данных), используя фабрику соединений, которая объявлена ​​поддерживающей xa, это означает, что соединение станет частью транзакции XA. Кроме того, совершенно не имеет значения, подключаетесь ли вы к одному или нескольким типам ресурсов, таким как JMS и база данных.

Надеюсь, это поможет.

Нитин

...