Ако осъществя достъп до 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 и 2 фазови ангажименти
  • ако има само един участник, повечето сървъри на приложения поддържат локален източник на данни и не използват пълноценния двуфазов протокол за ангажиране.

За Glassfish вижте:

РЕДАКТИРАНЕ

Параграф „обхват на транзакцията“ на документация на glassfish обяснява го по-добре от мен. Предполагам, че е същото за всички сървъри на приложения.

Локална транзакция включва само един не-XA ресурс и изисква всички участващи компоненти на приложението да се изпълняват в рамките на един процес. Оптимизирането на локалните транзакции е специфично за мениджъра на ресурси и е прозрачно за приложението Java EE.

В сървъра на приложения JDBC ресурсът не е XA, ако отговаря на някой от следните критерии:

  • В конфигурацията на пула за свързване на JDBC класът DataSource не имплементира интерфейса javax.sql.XADataSource.

  • Полето за глобална поддръжка на транзакции не е отметнато или настройката за тип ресурс не съществува или не е зададена на javax.sql.XADataSource.

Транзакцията остава локална, ако следните условия са валидни:

  • Използва се един и само един не-XA ресурс. Ако се използва допълнителен ресурс, различен от XA, транзакцията се прекъсва.
  • Не се извършва импортиране или експортиране на транзакция.

Транзакциите, които включват множество ресурси или процеси с множество участници, са разпределени или глобални транзакции. Глобална транзакция може да включва един ресурс, който не е XA, ако оптимизацията на последния агент е активирана. В противен случай всички ресурси трябва да са XA. Свойството use-last-agent-optimization е зададено на 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