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

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

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


person Aravind Yarram    schedule 10.03.2010    source источник


Ответы (2)


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

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

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

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

Короче:

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

Для 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, происходит однофазная фиксация, в противном случае транзакция координируется с протоколом двухфазной фиксации.

person ewernli    schedule 11.03.2010
comment
В мире WebSphere оптимизация последнего агента известна как оптимизация последнего ресурса. - person Aravind Yarram; 02.01.2011

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

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

Нитин

person Nitin Verma    schedule 29.07.2011