Если я получаю доступ к UserTransaction, означает ли это, что я использую 2-фазную фиксацию или XA?
-
19-09-2019 - |
Вопрос
Пользовательская транзакция ut=поиск....ut.beginTransaction();saveToFooDB();statelessEjb.transactionSupportedMethod();//сохраняет что-либо в Foo DB saveToFooDB();ut.зафиксировать();
Если бы я делал вышеописанное, то, насколько я понимаю, это не транзакция XA, поскольку она не распространяется на несколько ресурсов (например, DB плюс JMS).Правильно ли я понимаю?
Решение
Источник данных может быть сконфигурирован двух видов:
- XA:эти источники данных могут участвовать в транзакциях распространения
- Местные новости:также называемые не-XA, они не могут участвовать в распределенной транзакции
Тот самый UserTransaction
определяется в спецификации JTA, которая описывает, как координировать действия участника распределенной транзакции.
Однако сервер приложений, который реализует спецификацию JTA, может выполнять множество оптимизаций.Одним из них является last-agent-optimization
, что позволяет последнему участнику распределенной транзакции быть Местные новости.Затем для последних участников выполняется обычная фиксация.Если есть только один участник, то это всегда так.
Короче говоря:
- если у вас более одного участника, необходимо использовать XA и 2-фазную фиксацию
- если есть только один участник, большинство серверов приложений поддерживают локальный источник данных и не используют полномасштабный протокол 2-фазной фиксации.
О стеклянной рыбе см.:
Редактировать
Пункт "объем сделки" glassfish Документация объясняет это лучше, чем я.Я думаю, это одно и то же для всех серверов приложений.
Локальная транзакция включает только один ресурс, не относящийся к XA, и требует, чтобы все участвующие компоненты приложения выполнялись в рамках одного процесса. Локальная оптимизация транзакций специфична для менеджера ресурсов и прозрачна для приложения Java EE .
На сервере приложений JDBC ресурс не является XA, если он соответствует любому из следующих критериев:
В конфигурации пула соединений JDBC класс DataSource не реализует интерфейс javax.sql.XADataSource.
Флажок Глобальная поддержка транзакций не установлен, либо параметр Resource Type не существует или не задан установлено значение javax.sql.XADataSource.
Транзакция остается локальной, если выполняются следующие условия:
- Используется один и только один ресурс, не относящийся к XA.Если используется какой-либо дополнительный ресурс, отличный от XA , транзакция прерывается.
- Импорт или экспорт транзакций не происходит.
Транзакции, в которых задействовано несколько ресурсов или несколько участников процессы являются распределенными или глобальными транзакции.Глобальная транзакция может включать один ресурс, не относящийся к XA, если включена последняя оптимизация агента.В противном случае все ресурсы должны быть XA.Для свойства use-last-agent-optimization по умолчанию установлено значение true.Дополнительные сведения о том, как настроить это свойство, см. в разделе Настройка Службы транзакций.
Если в транзакции используется только один ресурс XA, происходит однофазная фиксация, в противном случае транзакция координируется с помощью двухфазного протокола фиксации .
Другие советы
Как только вы запускаете UserTransaction, а затем получаете соединение с ресурсом (например, базами данных), используя фабрику соединений, которая объявлена поддерживающей xa, это означает, что соединение станет частью транзакции XA.Кроме того, совершенно не имеет значения, подключаетесь ли вы к одному или нескольким типам ресурсов, таким как JMS и database.
Надеюсь, это поможет.
Нитин