Tranzacție (tranzacție în limba engleză) - un grup de operații secvențiale, care este o unitate logică de lucru cu date.
Tranzacțiile reprezintă unul dintre conceptele fundamentale ale tuturor bazelor de date. Esența unei tranzacții este legarea mai multor pași într-o singură operațiune pe o bază totală sau totală. stări intermediare interne între etapele nu sunt vizibile pentru alte tranzacții concurente, și dacă la momentul tranzacției, a apărut o eroare care împiedică tranzacția este finalizată, baza de date nicio modificare nu va fi făcută.
Imaginați-vă un sistem de comandă a cărților pe site-ul Web. Procesul de comandă a cărților elimină cartea pe care ați selectat-o din depozit și o plasează în coșul dvs. de cumpărături, iar costul cărții este anulat de pe cardul dvs. de credit. Ambele acțiuni trebuie fie finalizate cu succes, fie nu trebuie să apară niciunul dintre acestea. Dacă există un eșec atunci când cartea este primită din depozit, plata nu ar trebui să fie retrasă de pe cardul de credit. Un astfel de scenariu poate fi implementat cu ajutorul tranzacțiilor.
Cea mai obișnuită utilizare a tranzacțiilor este atunci când introduceți și actualizați informațiile din baza de date. Tranzacțiile pot fi, de asemenea, efectuate atunci când scrieți un mesaj într-o coadă de mesaje sau când scrieți date într-un registru de fișiere sau de sistem.
Mai multe acțiuni pot fi părți ale unei singure tranzacții.
Există diferite modele de tranzacții care pot fi clasificate pe baza diferitelor proprietăți, inclusiv structura tranzacției, paralelismul în cadrul unei tranzacții, durata, etc. Cel mai adesea înseamnă tranzacție tradițională, caracterizată prin patru proprietăți clasice: atomicitate, consistență, izolare, durabilitate (rezistenta) - ACID (atomicitate, coerență, izolare, durabilitate). Uneori tranzacțiile tradiționale se numesc tranzacții ACID. Proprietățile menționate mai sus înseamnă următoarele.
Proprietatea atomicității (Atomicitatea) este exprimată prin faptul că tranzacția trebuie să fie efectuată în ansamblu sau să nu fie efectuată deloc.
Proprietatea Consistență asigură că, pe măsură ce tranzacțiile progresează, datele se mută dintr-o stare consecventă în alta - tranzacția nu distruge coerența reciprocă a datelor.
Proprietatea de izolare înseamnă că tranzacțiile care concurează pentru accesarea bazei de date sunt prelucrate fizic secvențial, izolate unele de altele, dar pentru utilizatori se pare că funcționează în paralel.
Proprietatea durabilității este interpretată după cum urmează: în cazul în care tranzacția este încheiată cu succes, modificările datelor pe care le-a produs nu pot fi pierdute în nici un caz (chiar și în cazul erorilor ulterioare).
Dacă toți operatorii au succes și nu au loc defecțiuni software sau hardware în timpul tranzacției, tranzacția este angajată.
O comitere a tranzacțiilor este o acțiune care permite bazei de date să scrie modificări în baza de date care au fost făcute în timpul tranzacției. Până la corectarea tranzacției, este posibilă revocarea acestor modificări, restabilirea bazei de date la starea în care era în momentul tranzacției. Fixarea unei tranzacții înseamnă că toate rezultatele tranzacțiilor devin permanente. Acestea vor deveni vizibile pentru alte tranzacții numai după tranzacția în curs. Până atunci, toate datele afectate de tranzacție vor fi "vizibile" utilizatorului în starea de la începutul tranzacției curente.
Dacă sa întâmplat ceva în timpul executării tranzacției, ceea ce face imposibilă finalizarea acesteia în mod normal, baza de date trebuie returnată în starea inițială. O revocare a tranzacției este o acțiune care asigură faptul că toate modificările aduse datelor care au fost făcute de instrucțiunile SQL din corpul tranzacției în așteptare sunt anulate.
Fiecare operator dintr-o tranzacție își îndeplinește partea de serviciu, dar pentru a finaliza toată munca în ansamblul său, toți operatorii trebuie să fie reziliați necondiționat. Gruparea operatorilor într-o tranzacție indică DBMS-ului că întregul grup trebuie executat ca o singură unitate și această implementare trebuie suportată automat.
Standardul ANSI / ISO SQL definește un model de tranzacție și funcțiile instrucțiunilor COMMIT și ROLLBACK. Standardul specifică faptul că tranzacția începe cu prima instrucțiune SQL inițiată de utilizator sau inclusă în program. Toate instrucțiunile SQL ulterioare constituie corpul tranzacției. Tranzacția se termină în una din cele patru căi posibile (figura 1):
declarația COMMIT indică o tranzacție de succes; utilizarea sa face modificări constante în baza de date în cadrul tranzacției curente;
instrucțiunea ROLLBACK întrerupe tranzacția, aruncând înapoi modificările făcute în baza de date în cadrul acestei tranzacții; o nouă tranzacție începe imediat după utilizarea ROLLBACK;
finalizarea cu succes a programului în care a fost inițiată tranzacția curentă înseamnă finalizarea cu succes a tranzacției (ca și cum ar fi fost folosită declarația COMMIT);
o terminare eronată a programului termină tranzacția (ca în cazul în care a fost utilizată instrucțiunea ROLLBACK).
Există și alte modele de tranzacții (de exemplu, adoptate în Sybase). SQL dialectul Sybase include patru operatori de procesare a tranzacțiilor:
instrucțiunea BEGIN TRANSACTION semnalează începerea tranzacției;
instrucțiunea COMMIT TRANSACTION indică o tranzacție de succes; înțelesul său corespunde operatorului COMMIT în modelul ANSI / ISO, dar după utilizarea acestuia nu începe o nouă tranzacție;
instruciunea SAVE TRANSACTION stabilește valoarea de salvare în corpul tranzacției - adică salvează starea bazei de date atinsă în momentul utilizării agentului. Punctele de salvare sunt numite, ceea ce vă permite să setați mai multe puncte de salvare în tranzacție; Numele de salvare este specificat în instrucțiunea SAVE TRANSACTION.
operatorul ROLLBACK TRANSACTION execută două funcții. Dacă numele punctului de salvare este specificat în instrucțiune, starea bazei de date atinsă la momentul executării instrucțiunii SAVE TRANSACTION este derulată înapoi. Dacă operatorul nu specifică numele punctului de salvare, modificările se revin la momentul începerii tranzacției (a se vedea figura 2).
Pierderile apar atunci când două sau mai multe programe citesc aceleași date din baza de date, fac modificări și apoi încearcă să scrie rezultatul în același loc în același timp. Desigur, modificările efectuate de un singur program pot fi salvate în baza de date. - orice alte modificări vor fi pierdute.
Lipsesc modificări. Această situație poate apărea dacă două tranzacții modifică simultan aceeași înregistrare în baza de date. De exemplu, doi operatori lucrează la acceptarea comenzilor, primul operator a acceptat o comandă pentru 30 de monitoare. Când a cerut un depozit, s-au înregistrat 40 de monitoare, iar el a primit confirmarea de la client facturat și proiectat vânzarea de 30 de monitoare de la 40. Împreună cu el rulează de-al doilea operator, care ia o comandă pentru 20, cum ar fi monitoare (și model foarte bun și ieftin) și, la rândul său, cererea de magazin de stat și pentru a obține sursa de același număr de 40, el pune cu succes o comandă pentru clientul său. Finisare de lucru cu comanda, el execută Update de comandă (UPDATE), care pune la dispoziție 20 iar restul monitoarele favorit stoc. Dar apoi, în cele din urmă, cu amabilitate spunând la revedere de la clientul său și asigurându-i o livrare rapidă a monitoarelor comandate comanda cu finalizand prima declarație, și execută, de asemenea, Actualizare de comandă și stochează 10 restul aceluiași monitor în acest moment. Fiecare dintre ei este mulțumit de munca sa, dar știm ce sa întâmplat. În primul rând, au vândut 50 de monitoare din cele 40 de produse existente, iar alte 10 monitoare sunt încă în depozit. Baza de date este acum într-o stare inconsistentă, iar firma are probleme grave. Modificările aduse de cel de-al doilea operator au fost ignorate de programul de executare a ordinelor cu care a lucrat primul operator. O situație similară este prezentată în Fig. 11.5.
Evident, este necesară o anumită disciplină de procesare a tranzacțiilor, care permite eliminarea problemelor descrise mai sus și altele asemenea. O astfel de disciplină există și se bazează pe următoarele reguli:
(1) În timpul tranzacției, utilizatorul (sau programul) "vede" numai starea convenită a bazei de date. Utilizatorul (sau programul) nu poate accesa niciodată modificările neangajate ale datelor obținute ca urmare a acțiunilor unui alt utilizator (program);
(2) În cazul în care două tranzacții, A și B, sunt executate în paralel, SGBD consideră că rezultatul va fi același ca și în cazul în care: - O tranzacție va fi efectuată mai întâi, urmată de tranzacție B au fost efectuate; - tranzacția B va fi efectuată mai întâi, urmată de A. tranzacția va fi executată
Această disciplină este cunoscută sub numele de serializare a tranzacțiilor. De fapt, se asigură că fiecare utilizator (program) care accesează baza de date lucrează cu acesta ca și când nu există alți utilizatori (programe) care accesează aceleași date în același timp. Pentru implementarea practică a acestei discipline, majoritatea DBMS-urilor comerciale utilizează un mecanism de blocare.
Pentru a clarifica mecanismul de blocare de acțiune folosesc Fig.3 Acesta prezintă trei tabele de baze de date (Verificați produsul Branch ..) care pot fi accesate în timpul executării a două tranzacții - A și B. Când A la efectuarea unei tranzacții accesează tabelele Verificați și Sucursală . DBMS blochează un fragment al tabelului (ceea ce se înțelege prin fragment - acesta va fi prezentat mai jos) până când tranzacția este angajată sau anulată. Tranzacția B este executată în paralel și blochează masa în momentul executării acesteia. În cazul în care se face o încercare de a accesa un tabel de blocare, procesarea tranzacțiilor este suspendată și reluată numai după tranzacție A completează și eliberează tabelului blocat de acesta în cursul tranzacției B.