Если я получаю доступ к UserTransaction, означает ли это, что я использую двухфазную фиксацию или XA?

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

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

2 ответа

Решение

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

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

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

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

Короче:

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

Для Glassfish см:

РЕДАКТИРОВАТЬ

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

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

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

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

  • Поле "Глобальная поддержка транзакций" не отмечено, либо параметр "Тип ресурса" не существует или для него не установлено значение javax.sql.XADataSource.

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

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

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

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

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

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

Нитин

Другие вопросы по тегам