XA (din limba engleză extended architecture [1] , X / Open XA ) este o specificație a tranzacțiilor distribuite care definește principiile pentru participarea în comun a resurselor tranzacționale la o tranzacție într-un mediu de calcul distribuit . Descris pentru prima dată în 1992, este standardul de implementare de facto în managerii de tranzacții distribuite și bazele de date relaționale .
O tranzacție XA este o tranzacție distribuită executată sub controlul unui sistem care respectă specificația XA.
La începutul anilor 1990, existau mai multe standarde diferite pentru tranzacțiile distribuite, de exemplu, TPF, utilizat în aviația civilă din SUA și în anii 2010 [2] , CISC, VMS și altele. Unul dintre ei, SNA al IBM, devenise până atunci standardul de facto. Influențat de acest standard și de standardul LU6.2, ISO a creat câteva standarde noi [3] :
Principalul dezavantaj al acestor standarde a fost lipsa unui API , așa că au specificat cum ar trebui să interacționeze managerii de tranzacții, dar nu au oferit reguli pentru scrierea aplicațiilor portabile.
X/Open a rezolvat această problemă prin furnizarea unui model de tranzacție distribuită și, în același timp, prin specificarea unei interfețe procedurale pentru interacțiunea participanților la o tranzacție (CLI), specificația XA.
XA utilizează un model de tranzacție distribuită care constă din trei componente:
Deși există trei componente în model, specificația XA definește doar interacțiunea dintre managerii de resurse și de tranzacții.
Specificația XA împarte tranzacțiile în locale și globale. Tranzacțiile locale sunt cel mai simplu tip de tranzacții, în care programul de aplicație accesează doar un SGBD și determină când să comite sau să anuleze tranzacția. Adică, în ele rolul de TM este atribuit AP. Tranzacțiile globale (distribuite) sunt un caz mai complex, în care decizia de a efectua modificări sau de a derula înapoi cade pe umerii coordonatorului, programul de aplicare determină doar limitele tranzacțiilor. Managerul de tranzacții împarte o tranzacție globală în mai multe ramuri care se execută local ( eng. branch ), iar după o comitere reușită pe fiecare dintre ramuri, comite întreaga tranzacție globală și, în caz contrar, face înapoi.
În plus, specificația acceptă tranzacții imbricate , care sunt utile, de exemplu, pentru înregistrare .
Specificația XA+ , lansată în 1994, definește și tranzacțiile distribuite între aplicații. În XA +, apare un alt participant la tranzacție - Managerul resurselor de comunicare (CRM), care este responsabil de coordonarea între mai mulți manageri ai tranzacțiilor distribuite, în acest model el este responsabil pentru noi ramuri ale tranzacției, care, la rândul lor, conțin mai multe sucursale, precum și pentru generarea de ID-uri de tranzacție.
Deși XA specifică doar un API pentru limbajul C, există implementări în alte limbaje de programare.
API-ul Java Transaction este o implementare a XA pentru platforma J2EE , lansată pentru prima dată în 1999. În .Net Framework , suportul pentru tranzacții distribuite a apărut doar în versiunea 2.0, cu excepția XA, implementarea .NET a tranzacțiilor distribuite acceptă OLE [4] .
Specificația Object Management Group din 1991 pentru Object Transaction Service introduce tranzacționalitatea în CORBA . Datorită faptului că specificația nu separă participanții la tranzacție în RM și TM, ci doar în client și server, este posibil să se utilizeze XA și OTS într-o aplicație client-server. În plus, dacă unul dintre RM-uri nu acceptă XA, dar acceptă OTS, atunci acest pachet este singura soluție posibilă la problema tranzacțiilor distribuite într-un astfel de mediu.
Combinația de XA și OTS este utilizată în Java EE, unde wrapper-ul peste OTS este Java Transaction Service , iar API-ul Java Transaction, la rândul său, separă JTS de AP.