Источник данных можно настроить двух видов:
- 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