ALTE DOCUMENTE
|
||||||||
O tranzactie reprezinta una sau mai multe instructiuni SQL care compun o singura unitate logica de lucru. Tranzactia începe cu prima instructiune SQL executata si se încheie în momentul în care efectele tranzactiei sunt salvate sau sunt derulate înapoi.
Pentru fiecare tranzactie, programul Oracle permite doua alternative. Daca instructiunile SQL dintr-o tranzactie sunt finalizate normal, efectele tranzactiei devin permanente în baza de date. Acest lucru se numeste finalizarea (salvarea) tranzactiei. Daca, însa, dintr-un motiv oarecare, instructiunile SQL nu sunt finalizate cu succes, efectele tranzactiei sunt eliminate din baza de date si tranzactia se încheie. Aceasta eliminare a efectelor unei tranzactii se numeste derularea înapoi a tranzactiei.
Tranzactiile dau posibilitatea utilizatorului serverului Oracle, programatorului aplicatiei si administratorului bazei de date sa garanteze coerenta si simultaneitatea datelor. Coerenta datelor furnizeaza utilizatorului o imagine coerenta a datelor, care consta din date salvate de alti utilizatori precum si modificari efectuate de utilizatorul însusi. Simultaneitatea (concurenta) datelor 16416n1318q permite utilizatorului sa acceseze date care sunt utilizate simultan de multi alti utilizatori.
În lipsa tranzactiilor care sa coordoneze simultaneitatea si coerenta datelor, utilizatorul ar avea de-a face cu citiri de date incoerente, cu actualizari pierdute si citiri nereproductibile. In plus, instructiunile DDL lansate de ceilalti utilizatori ar putea sa distruga operatiile dumneavoastra. De exemplu, s-ar putea întâmpla ca dumneavoastra sa efectuati actualizarea unui tabel în timp ce un alt utilizator sa încerce simultan sa distruga acelasi tabel.
Pentru a rezolva problemele legate de utilizarea simultana (concurenta) si coerenta datelor, bazele de date multi-utilizator folosesc o forma de blocare a datelor. Blocarile (locks) previn interactiunea distructiva între utilizatorii care acceseaza acelasi tabel sau aceeasi linie a unui tabel.
Executarea unei tranzactii cu succes nu este echivalenta cu finalizarea tranzactiei. O executare cu succes a unei tranzactii înseamna ca instructiunile SQL au fost executate fara erori. Cu toate acestea, efectele unei tranzactii executate cu succes pot fi derulate înapoi câta vreme tranzactia nu este finalizata.
Acest capitol prezinta diferite aspecte ale tranzactiilor si diverse moduri de gestionare a acestor tranzactii.
Comanda set transaction face parte integranta din gestionarea tranzactiei. Aceasta comanda efectueaza una dintre operatiile urmatoare asupra tranzactiei curente:
Defineste tranzactia ca fiind fie read-only, fie read-write
Asociaza tranzactia read-write cu un segment de revenire specificat
În mod prestabilit, tranzactiile sunt^de tip read-only. Tranzactiile de acest tip nu au asociat un segment de revenire. In plus, nu puteti efectua comenzile insert, delete si update în timpul tranzactiilor de acest tip.
În cazul tranzactiilor read-write nu exista nici o limitare referitoare la instructiunile DML permise pe parcursul lor.
Comanda set transaction va permite sa asociati în mod explicit un anumit segment de revenire unei tranzactii read-write. Acest segment de revenire este utilizat pentru anularea modificarilor efectuate de tranzactia curenta atunci când se executa o derulare înapoi. Daca nu specificati un segment de revenire, sistemul Oracle asociaza unul tranzactiei.
Finalizarea (committing) unei tranzactii reprezinta salvarea permanenta explicita sau implicita a modificarilor tranzactiei în baza de date. Pâna în momentul în care efectuati o finalizare, tranzactia dumneavoastra este caracterizata prin urmatoarele afirmatii:
Operatiunile DML afecteaza numai tamponul tranzactiei. Întrucât modificarile afecteaza numai tamponul, acestea pot fi ignorate.
În server este creat un tampon pentru un segment de revenire.
Proprietarul tranzactiei poate vedea efectele tranzactiei cu instructiunea select.
Ceilalti utilizatori ai bazei de date nu pot vedea efectele tranzactiei.
Liniile afectate sunt blocate si ceilalti utilizatori nu pot modifica datele acestor linii.
Atunci când se executa o finalizare, sunt parcurse urmatoarele etape:
Liniile afectate sunt deblocate.
Tranzactia este marcata ca fiind finalizata.
Tabelul intern de tranzactii al serverului genereaza un numar de identificare a modificarii, asociaza acest numar tranzactiei si le salveaza pe ambele în tabel.
Pentru a face în mod explicit permanente toate modificarile efectuate de o tranzactie, folositi instructiunea comiti it. Exemplul urmator ilustreaza executia unei tranzactii simple, urmata de lansarea comenzii commit:
SQL>insert into table materii-prime values
SQL>(cod_articol, nume_articol)
SQL>values (s_mat_prima.nextval, "Sarma cupru 18g");
1 row created
SQL> COMMIT;
Commit completed
Puteti folosi clauza comment împreuna cu instructiunea commit pentru a plasa un text în dictionarul de date împreuna cu numarul de identificare al tranzactiei. Ulterior, puteti afisa comentariile din dictionarul de date cu ajutorul vederii dba_2pc_pending.
Pentru a efectua o finalizare explicita, trebuie sa posedati privilegiul de sistem f orce transaction. Pentru a finaliza manual o tranzactie distribuita care a fost initiata de alt utilizator, trebuie sa posedati privilegiul de sistem f orce any transaction.
Oracle efectueaza o finalizare implicita înainte si dupa fiecare comanda DDL,
Sistemul Oracle gestioneaza finalizarile si derularile înapoi ale tranzactiilor distribuite si mentine integritatea tuturor bazelor de date distribuite care participa la tranzactia distribuita. Oracle efectueaza aceste sarcini printr-un mecanism cunoscut sub numele de finalizare în doua faze.
Într-un mediu nedistribuit, toate tranzactiile sunt fie finalizate, fie derulate înapoi ca un întreg, în schimb, într-un mediu distribuit, finalizarea si derularea înapoi a unei tranzactii trebuie coordonata în întreaga retea astfel încât bazele de date fie sa salveze în bloc, fie sa deruleze înapoi, în bloc, tranzactia. Acest lucru trebuie sa fie adevarat chiar si atunci când reteaua cade în timpul unei tranzactii distribuite. Finalizarea in doua faze garanteaza faptul ca nodurile participante la tranzactie fie salveaza, fie deruleaza înapoi tranzactia, acest lucru ducând la mentinerea nemodificata a integritatii datelor bazei de date globale.
Toate operatiunile DML implicite efectuate prin intermediul restrictiilor de integritate, al apelurilor procedurilor situate la distanta si al declansatorilor sunt protejate în mediul Oracle de finalizarea în doua faze!
Derularea înapoi a unei tranzactii înseamna anularea tuturor modificarilor efectuate de tranzactia curenta. Comanda rollback anuleaza întreaga tranzactie. Pentru a efectua derularea înapoi a întregii tranzactii, introduceti comanda rollback în linia de comanda sqlplus. Ca alternativa, puteti derula înapoi o portiune a unei tranzactii cu comanda rollback to savepoint. Punctele de salvare sunt prezentate în paragraful urmator.
Atunci când derulati înapoi o întreaga tranzactie, se petrec urmatoarele:
Toate modificarile efectuate de tranzactia curenta sunt anulate folosind segmentul de revenire corespunzator.
Sunt deblocate toate liniile blocate de tranzactia curenta.
Tranzactia ia sfârsit.
Atunci când derulati înapoi o tranzactie pâna la un punct de salvare, se petrec urmatoarele:
Sunt derulate înapoi numai instructiunile SQL executate dupa ultimul punct de salvare.
Punctul de salvare specificat în comanda rollback este pastrat, însa toate punctele de salvare de dupa acesta sunt eliminate din baza de date.
Sunt deblocate toate liniile care au fost blocate, începând de la punctul de salvare specificat.
Tranzactia este în continuare activa si poate continua.
Pentru derularea înapoi a propriilor tranzactii nu sunt necesare nici un fel de privilegii. Sistemul Oracle va impune sa posedati privilegiul de sistem force transaction pentru a derula înapoi orice tranzactie distribuita "în-dubiu" care va apartine. O tranzactie "în-dubiu" este o tranzactie care este executata în unul sau mai multe noduri ale unei baze de date distribuite. Tranzactia devine "în-dubiu" atunci când reteaua care leaga aceste noduri cade sau când unul dintre noduri nu poate finaliza procesarea tranzactiei. Consultati Capitolul 40, "Baze de date si procese distribuite", pentru informatii suplimentare în legatura cu bazele de date distribuite. Daca tranzactia distribuita este proprietatea altei persoane, trebuie sa posedati privilegiul de sistem f orce any transaction.
Oracle efectueaza o salvare implicita daca survin probleme grave cu calculatorul gazda sau cu programul de aplicatie.
Un punct de salvare este ca un semn de carte pe parcursul tranzactiei; îl plasati în mod explicit pentru a face referire la el ulterior. Punctele de salvare sunt folosite pentru a împarti o tranzactie de dimensiuni mari în fragmente mai mici. Aveti astfel posibilitatea sa derulati înapoi ceea ce ati lucrat, pâna în puncte intermediare ale tranzactiei, în loc sa fiti nevoit sa derulati înapoi întreaga tranzactie. De exemplu, daca efectuati un mare numar de actualizari si survine o eroare, trebuie sa derulati înapoi numai pâna la ultimul punct de salvare; în consecinta, nu veti fi nevoit sa reprocesati toate instructiunile.
Exemplul urmator creeaza punctul de salvare lista_credit:
savepoint lista_credit;
Numele punctelor de salvare trebuie sa fie unice într-o tranzactie data. Daca creati un al doilea punct de salvare cu acelasi nume ca unul anterior, punctul de salvare anterior este sters. Oricare dintre instructiunile urmatoare deruleaza înapoi o tranzactie pâna la punctul de salvare lista_credit:
rollback to savepoint lista_credit; rollback to lista credit;
Fiecare tranzactie necesita un segment de revenire asociat. Acest segment de revenire pastreaza informatiile necesare pentru anularea modificarilor efectuate de tranzactie, în mod implicit, Oracle asociaza un segment de revenire fiecarei tranzactii. Puteti totusi sa asociati în mod explicit un segment de revenire unei tranzactii, folosind comanda set transaction. Tranzactiilor li se asociaza în mod explicit segmente de revenire pentru urmatoarele motive:
Necesitatile de stocare ale segmentului de revenire pot fi gestionate mai eficient pentru a asigura o capacitate de stocare suficienta în extinderile existente.
Performantele sistemului sunt afectate foarte putin de segmentele de revenire deoarece nu se aloca dinamic extinderi suplimentare. Ulterior, aceste extinderi pentru segmentele de revenire trebuie sa fie si ele trunchiate.
Pentru a asocia în mod explicit segmentul de revenire, folositi instructiunea set transaction împreuna cu parametrul use rollback segment. Instructiunea urmatoare asociaza tranzactiei curente segmentul de revenire numit rbs_lst_credit:
set transaction-
use rollback segment rbs_lst_credit;
Utilizarea mai multor segmente de revenire îmbunatateste performantele sistemului. Sunt necesare mai multe segmente de revenire în urmatoarele situatii:
Atunci când este creata p baza de date, programul Oracle creeaza un segment de revenire numit system în spatiul-tabel system. Daca baza de date urmeaza sa aiba spatii-tabel multiple, trebuie sa aveti cel putin un segment de revenire în plus fata de segmentul de revenire al sistemului.
În cazul serverului Oracle paralel, fiecare instanta are nevoie de propriul segment de revenire.
Atunci când exista segmente de revenire multiple, sistemul Oracle încearca sa foloseasca segmentul de revenire al sistemului numai pentru tranzactii speciale ale sistemului si distribuie celelalte tranzactii în celelalte segmente de revenire. Daca sunt prea multe tranzactii pentru segmentele de revenire non-sistem, Oracle foloseste segmentul de revenire al sistemului.
Parametrul de initializare rollback_segments defineste segmentele de revenire care vor fi asociate unei instante. Modificati acest parametru pentru a forta procesul de initializare a unei instante sa asocieze instantei un anumit segment de revenire. Veti face acest lucru atunci când vreti sa fiti sigur ca segmentul dobândit are dimensiunea dorita sau se gaseste în spatiul-tabel corespunzator.
Dimensiunea segmentului de revenire poate afecta performantele tranzactiei. Segmentul trebuie sa fie suficient de mare^încât sa cuprinda informatiile de revenire pentru tranzactia dumneavoastra, în cazul segmentelor de revenire, trebuie evitata gestionarea dinamica a spatiului.
Dimensiunea segmentului este definita de parametrii de stocare ai segmentului de revenire. Dimensiunea totala a segmentului de revenire trebuie stabilita pe baza dimensiunii tipice a tranzactiilor din respectiva baza de date. în general, segmentele de revenire pot face fata cu usurinta tranzactiilor de orice dimensiuni. Totusi, în cazurile extreme, când tranzactia este foarte mica sau foarte mare, este recomandabil sa utilizati un segment de revenire dimensionat corespunzator.
Daca aplicatia ruleaza tranzactii foarte scurte, segmentele de revenire ar trebui sa fie suficient de mici, astfel încât sa fie pastrate tot timpul în memoria cache. Acest lucru îmbunatateste sensibil performantele. Principalul dezavantaj al acestei abordari este dat de probabilitatea sporita de a primi mesajul snapshot too o l d atunci când rulati o tranzactie mare. Concepeti aplicatia astfel încât sa utilizeze tranzactii scurte, ori de câte ori este posibil.
Este bine sa stabiliti o valoare mare a parametrului maxextents pentru segmentele de revenire. Acest lucru permite alocarea de noi extinderi pentru un segment de revenire.
Pentru a crea un segment de revenire, folositi comanda create rollback segment sau utilitarul SQL*DBA. Pentru a crea segmentul, trebuie sa posedati privilegiul de sistem create rollback segment. Dupa crearea segmentului de revenire, acesta nu poate fi utilizat pâna când nu este adus online. Pentru a aduce segmentul online, folositi comanda alter rollback segment cu clauza online. Puteti de asemenea sa folositi utilitarul SQL*DBA pentru a aduce segmentul online.
Sistemul Oracle blocheaza în mod automat o linie în numele unei tranzactii pentru a împiedica alte tranzactii sa blocheze aceeasi linie. Aceasta blocare împiedica manipularea simultana a unei Unii de catre doua tranzactii distincte, prevenindu-se astfel interferenta distructiva a instructiunilor DDL si DML contradictorii. De exemplu, Oracfe împiedica distrugerea unui tabel daca exista tranzactii nefinalizate în care este implicat tabelul respectiv. Aceste blocari ale datelor sunt anulate automat atunci când tranzactia este finalizata.
Operatiile DML pot bloca date din anumite linii ale anumitor tabele. Blocarea liniilor de catre o tranzactie se efectueaza automat atunci când o linie este modificata cu una dintre urmatoarele comenzi: insert, delete, update si select. Liniile ramân blocate pâna în momentul în care tranzactia este finalizata sau este derulata înapoi. Parametrul de initializare DML-Locks defineste numarul maxim de linii care pot fi blocate de toti utilizatorii într-un singur tabel.
O tranzactie realizeaza blocarea unui tabel atunci când tabelul este modificat cu una dintre urmatoarele instructiuni DML: insert, delete, update, select si lock table.
Blocarea implicita a datelor decurge automat pentru toate instructiunile SQL, astfel încât nu este necesar ca utilizatorii bazei de date sa blocheze liniile în mod explicit, în mod prestabilit, Oracle blocheaza resursele la nivelul cel mai scazut posibil.
Într-o baza de date multi-utilizator, blocarile se realizeaza la doua niveluri:
Exclusive |
Interzice partajarea resursei asociate. Prima tranzactie care monopolizeaza resursa este singura tranzactie care poate modifica resursa pâna în momentul deblocarii acesteia. |
Share |
Acest tip de blocare permite partajarea resursei, în functie de operatiile implicate. Mai multe tranzactii poat bloca în comun aceeasi resursa. Blocarile paratjate asigura un grad mai ridicat de concurenta a datelor decât blocarile exclusive. |
Preformantele tranzactiilor scurte, nepartajate pot fi îmbunatatite prin utilizarea procedurii begin_dis'crete_transaction. Aceasta procedura este inclusa în serverul Oracle cu optiunea procedurala. Aceasta procedura permite executarea mult mai rapida a tranzactiilor scurte.
Pe parcursul unei tranzactii discrete, toate modificarile efectuate asupra oricaror date sunt amânate pâna în momentul în care tranzactia este finalizata. Sunt generate informatiile de refacere însa acestea sunt stocate într-o locatie separata a memoriei. Atunci când se executa o finalizare, informatiile de refacere sunt scrise în jurnalul de refaceri, iar blocurile bazei de date sunt scrise direct în fisierul bazei de date. Aceasta abordare elimina necesitatea generarii informatiilor de anulare deoarece practic blocurile bazei de date nu sunt modificate pâna în momentul în care tranzactia este finalizata.
Procedura begin_discrete_transaction trebuie apelata înaintea primei trimiteri. Aceasta procedura este"activa numai pe parcursul tranzactiei respective. Orice tranzactie care urmeaza trebuie sa re-apeleze procedura.
Tranzactiile care utilizeaza procedura begin_discrete_transaction nu pot participa la tranzactii distribuite.
Tranzactiile sunt grupuri logice de instructiuni SQL. Fiecare tranzactie se încheie fie cu o finalizare, fie cu o derulare înapoi. Finalizarile duc la salvarea permanenta a modificarilor bazei de date efectuate de catre tranzactie. Derularile înapoi anuleaza toate modificarile bazei de date efectuate de catre tranzactie.
Gestionarea tranzactiilor asigura concurenta si coerenta datelor pentru toti utilizatorii bazei de date. în lipsa gestiunii tranzactiilor, calitatea si precizia datelor ar fi compromise, iar baza de date ar deveni aproape de neutilizat.
În acest capitol, ati facut cunostinta cu diverse aspecte ale gestionarii tranzactiilor, printre care finalizarea, derularea înapoi, segmentele de revenire si blocarea datelor. De asemenea, ati aflat ca multe dintre aspectele gestionarii tranzactiilor sunt predefinite de serverul Oracle. Cu toate acestea, Oracle va permite sa personalizati unii dintre parametrii tranzactiilor în vederea satisfacerii cerintelor dumneavoastra.
|