Если я получаю доступ к 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 и база данных.
Надеюсь, это поможет.
Нитин