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

StackOverflow https://stackoverflow.com/questions/2413911

Вопрос

Пользовательская транзакция 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.

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

Нитин

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top