В чем разница между nonXADatasource с jta="true" и XADataSource?

меня смутил тот факт, что мы можем разрешить использовать транзакции JTA с не-XA-datasource. ссылка на документацию. Так в чем же разница между источниками данных XA/non-XA? Почему мы вообще должны использовать XA-datasources?

2 ответов


транзакция XA, в самых общих терминах, является "глобальной транзакцией", которая может охватывать несколько ресурсов. Транзакция, отличная от XA, всегда включает только один ресурс.

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

jta= "true", транзакция фиксируется автоматически.


Мне было интересно об этом самому (опция"использовать JTA" в источнике данных, отличном от XA), поэтому я протестировал несколько конфигураций. У меня есть распределенная транзакция, соединяющаяся с двумя серверами MySQL.

вот мои результаты. Если у меня есть:

  1. два источника данных не-XA, оба имеют JTA= "true"

результат: ошибка " не удалось заручиться транзакцией при вводе объекта meta-aware."

  1. два источника данных non-XA, с одним JTA="true"

результат: они не будут участвовать в распределенной транзакции. Каждый совершит отдельно.

  1. один XA и один не-XA с JTA= "false",

результат: то же, что и #2

  1. один XA и один не-XA с JTA= "true".

Результат: Работает!

из них похоже, что опция "использовать JTA" указывает, будет ли она участвовать в распределенной транзакции, если есть XA источник.