Transakcija

**Transakcija** – loginis duomenų bazių darbo vienetas, veiksmų duomenų bazėje seka. Transakcija vykdoma iki galo, arba anuliuojama visiškai. Transakciją galima apibūdinti kaip duomenų bazės transformavimą iš vienos suderintos į kitą suderintą būseną, tačiau tarpiniuose taškuose duomenų bazė yra nesuderintoje būsenoje.
 
Jei transakcija nepavyko todėl, jog jos metu kompiuterinė sistema nustojo dirbusi, naujai paleidus sistemą joje neturi likti neužbaigtos transakcijos pėdsakų. Pavyzdžiui, pervedant banke pinigus, pervedama suma nuskaičiuojama nuo vienos sąskaitos ir pridedama prie kitos. Normaliam darbui būtina, jog, nepriklausomai nuo bet kokių aplinkybių turi būti atlikti arba abu šie veiksmai, arba nei vienas.

Teisingai dirbančioje duomenų bazių sistemoje transakcijai būdingos šios savybės:
* **Atomiškumas** – transakcijos operacijos pavyksta arba visos, arba nei viena.
* **Stabilumas** – tiek prieš transakciją, tiek ir po jos sistema yra normalioje darbo būsenoje.
* **Izoliacija** – tarpiniai transakcijos operacijos rezultatai yra nematomi. Matomas galutinis jos rezultatas, kuris iškart pakeičia pradinį duomenų bazės turinį.
* **Ilgalaikiškumas** – jei vartotojo programa gavo informaciją, jog transakcija pavyko, transakcijos rezultatai savaime išnykti nebegali.

Angliškai šie reikalavimai sutrumpintai užrašomi kaip ACID (*atomicity, consistency, isolation, durability*).

Programuojant SQL, darbo su transakcija seka yra tokia:
* Sukurti transakciją.
* Įvykdyti vieną ar kelias darbo su duomenų baze komandas.
* Įvykdyti transakciją (tik tuomet iš tiesų bus pakeistas duomenų bazės turinys).

Duomenų bazė, palaikanti transakcijas, vadinama *transakcine duomenų baze*. Dauguma šiuolaikinių duomenų bazių yra transakcinės.

Taip pat yra ir transakcinių failų sistemų: Reiser4 (atviro kodo, skirta GNU/Linux) ir naujausios NTFS versijos (uždaro kodo, skirta Windows).

## Transakcijos J2EE aplinkoje

Enterprise lygio aplikacijose būtina užtikrinti saugų, patikimą, atkuriamą duomenų prieinamumą ir manipuliaciją jais, todėl transakcijų palaikymas vienas iš pagrindinių J2EE architektūros elementų.

J2EE aplinkoje vienos transakcijos metu palaikoma kombinuota servlet ir JSP puslapių daugelio „*enterprise*“ komponentų („*beans*“) prieiga. Kiekvienas komponentas gali turėti kelis prisijungimus prie keleto resursų valdiklių (resource managers).

J2EE aplinka palaiko abiejų programinių ir vaizdžiai deklaruojamų transakcijų demarkaciją. Komponento teikėjas (provider) Java Transaction API pagalba gali programiškai atskirti transakcijos ribas komponentų programiniame kode. Enterprise komponentai (beans) palaiko vaizdžiai deklaruotiną transakcijos demarkaciją, ir Enterprise komponentų konteineriai automatiškai pradeda ir užbaigia transakcijas remdamiesi vykdymo aplinkos. Abiem atvejais, transakcijų valdymas vykdomas pačioje J2EE aplinkoje.

J2EE transakcijų valdymo komponentų ir aplikacijų kodas yra atviras. J2EE aplikacijų serveriui būtini žemo lygio operacijų protokolai, tokie kaip tarpusavio sąveikos tarp transakcijų valdiklio ir resursų valdiklių, transakcijų perdavimo ar dviejų fazių commit protokolai. J2EE aplinka palaiko tik vadinamąsias "plokščias" ("flat") transakcijas, t. y. transakcijos negali būti sudarytos iš vaikinių/įdėtinių (child/nested) transakcijų.

Aplikacija gali atlikti transakcijų paskirstymą todėl, kad valdiklio perduodamos transakcijos skirtingiems resursų valdikliams. Transakcijų valdikliai gali bendradarbiauti tarpusavyje paskirstydami keletą transakcijų perduodamų J2EE serverio ribose. Panašiai, kaip dideliame parduotuvių tinkle, vienos parduotuvės vadybininkas gali bendradarbiausi su kitos parduotuvės vadybininku (tos pačios įmonės viduje), suteikdamas galimybę klientams mokėti už prekę vienoje prekybos vietoje, o prekę gauti kitoje. Tokios transakcijų valdymo galimybės leidžia pasiekti aukštą integracijos lygį visoje įmonėje.

Kelerius ateinančius skyriai teikia pavyzdžius šių operacijų scenarijų, kuris apima keletą platinamos sandorio dalyviai.
Žemiau pateikiama keletas tokių transakcijų valdymo galimybių pavyzdžių.

1 Prieiga prie daugelio resursų

Nuo 1.3 J2EE versijos, J2EE produktai vienos transakcijos metu palaiko prieigą prie:

* Vienos JDBC duomenų bazės (leidžiama keletas prisijungimų prie tos pačios duomenų bazės)
* Vieno Java Message Service (JMS) paslaugų teikėjo
* Keleto Enterprise Information Systems (EISs) per resource adapters (Connectors), nurodant XATransaction transakcijų lygį

Prieiga prie kelių JDBC duomenų bazių ar palaikymas keleto JMS paslaugų teikėjo vienos transakcijos metu J2EE versijoje 1.3 nėra numatyta. Kai kurie produkto teikėjai gali numatyti savo produktuose šias nestandartines galimybes. Pavyzdžiui, J2EE prieiga prie kelių JDBC duomenų bazių vienos transakcijos metu palaikoma per XA-capable JDBC tvarkykles (drivers).
1.1 Pavyzdys: Transakcijos tarp keleto resursų valdiklių

Toks scenarijus iliustruoja J2EE operaciją, kuri apima daug išteklių valdiklių. Paveiksle 1, klientas iškviečia X komponento metodą. X komponentas inicijuoja prisijungimą prie duomenų bazės A naudojant JDBC sąsają. Tada enterprise komponentas X inicijuoja Y komponento metodo iškvietimą, kuris siunčia JMS pranešimą į kitą sistemą naudojant JMS paslaugų teikėją. Po to komponentas Y inicijuoja komponento Z metodo iškvietimą, kuris atnaujina duomenis ir grąžina duomenis iš išorinės EIS sistemos naudojans išteklių adapterį, kuris veikimas pagrystas J2EE Connector architektūra. Transakcijų valdiklis J2EE serveryje koordinuoja veiksmus su trimis resursų valdikliais. Serveris užtikrina, kad duomenų bazės prieiga būtų inicijuota X komponento, pranešimo perdavimo - Y komponento ir EIS sistemos operacija, atliekama Z komponento pagalba, ir visi veiksmai arba išsaugomi arba atšaukiami.
     Pav. 1 A duomenų bazė,  JMS paslaugų teikėjas, ir EIS vienos transakcijos metu

Aprašant aplikacijos komponentus papildomo kodo, nusakančio transakcijos veikimą ir eigą, rašyti nereikia. Enterprise komponentai X, Y ir Z pasiekia resursus naudojant atitinkamai JDBC API, JMS ir J2EE Connector architektūra. J2EE serverio transakcijų valdiklis apjungia visas sistemas kaip vienos transakcijos dalis. Sėkmingos transakcijos pabaigoje, J2EE serverio ir resursų valdikliai atlieka dviejų etapų transakcijos užbaigimą (commit), užtikrinantį abiejų sistemų atnaujinimą.

2 Transakcijos tarp serverių

J2EE produktai gali palaikyti transakcijas tarp daugelio serverių.
2.2 Pavyzdys: Transakcijos tarp J2EE serverių

Paveiksle 2, klientas iškviečia komponentą X, kuris atnaujina duomenis enterprise informacinėje sistemoje A, tada iškviečia kitą komponentą Y, kuris patalpintas kitame J2EE serveryje. Komponentas Y atlieka skaitymą - rašymą enterprise informacinėje sistemoje B.
     Pav. 2 Transakcija jungia keletą J2EE serverių 

Kai X iškviečia Y, abu J2EE serveriai bendrauja tarpusavyje perduodami transakcijos kontekstą iš X į Y. Sėkmingos transakcijos pabaigoje, J2EE serveriai atlieka dviejų etapų transakcijos užbaigimą (commit), užtikrinantį abiejų sistemų atnaujinimą vienos transakcijos metu.

Programuojant J2EE aplinkoje, transakcijos EJB lygyje palaikomos automatiškai, tačiau tam reikia papildomai konfigūruoti J2EE serverį. Jei tenka kreiptis į duomenų bazę tiesiai iš servleto, transakcijos automatiškai nepalaikomos, tačiau jas nesunku realizuoti kviečiant transakcijoms skirtus metodus.

Daugiau informacijos adresu http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/transactions/transactions3.html#1049188