Я был смущен тем, что мы можем разрешить использование транзакций JTA с источником данных, отличным от XA. Ссылка на документацию. Итак, какова разница между источниками данных XA/non-XA? Почему мы должны использовать XA-источники данных вообще?
Какая разница между nonXADatasource с jta = "true" и XADataSource?
Ответ 1
Транзакция XA, в самых общих чертах, представляет собой "глобальную транзакцию", которая может охватывать несколько ресурсов. В транзакции, отличной от XA, всегда используется только один ресурс.
Транзакция XA включает координационный менеджер транзакций с одной или несколькими базами данных (или другими ресурсами, такими как JMS), которые участвуют в одной глобальной транзакции. Операции, отличные от XA, не имеют координатора транзакций, и один ресурс выполняет всю свою транзакционную работу (это иногда называют локальными транзакциями).
jta = "true", транзакция фиксируется автоматически.
Ответ 2
Мне было интересно об этом самостоятельно (опция "использовать JTA" в источнике данных, отличном от XA), поэтому я протестировал несколько конфигураций. У меня есть распределенная транзакция, соединяющая два сервера MySQL.
Вот мои результаты. Если у меня есть:
- Два источника данных, отличных от XA, оба имеют JTA = "true"
Результат: Ошибка "Не удалось заручиться транзакцией при вводе метаобновляемого объекта".
- Два источника данных, отличных от XA, с одним JTA = "true"
Результат: они не будут участвовать в распределенной транзакции. Каждый из них будет выполняться отдельно.
- Один XA и один не-XA с JTA = "false",
Результат: тот же, что и # 2
- Один XA и один не-XA с JTA = "true" .
Результат: Работает!
Из этого, похоже, опция "use JTA" указывает, будет ли она участвовать в распределенной транзакции, если есть источник данных XA.