Sunteți pe pagina 1din 3

Tranzacii n bazele de date

Tranzacii n bazele de date


Serverul Oracle asigur consistena datelor pe baza tranzaciilor. Tranzaciile ofer un plus de flexibilitate i control n modificarea datelor i asigur consistena datelor n eventualitatea unei erori n sistem sau n procesul utilizator. Tranzaciile constau din instruciuni ale LMD (Limbajul de Manipulare a Datelor) care produc o modificare consistent a datelor. De exemplu, un transfer de fonduri ntre dou conturi ar trebui s includ debitarea unui cont i creditarea celuilalt cu aceeai sum de bani. Ambele aciuni ar trebui fie s reueasc mpreun, fie s eueze mpreun. Operaia de creditare nu trebuie s fie efectuat fr ca cea de debit s aib succes.

Tipuri de tranzacii
Tip Limbajul de manipulare a datelor (LMD) Limbajul de definire a datelor (LDD) Descriere Const din orice numr de instruciuni LMD pe care serverul Oracle le trateaz ca fiind o singur unitate logic de lucru. Const dintr-o singur instruciune LDD

O tranzacie ncepe cnd este ntlnit prima instruciune SQL executabil i se termin n momentul apariiei unuia din urmtoarele evenimentele: se execut instruciunea COMMIT sau ROLLBACK; se execut o instruciune LDD, cum ar fi, de exemplu, instruciunea CREATE; se execut o instruciune LCD (instuciuni de acordare provilegii); utilizatorul prsete mediul SQL*Plus; apare o eroare de sistem.

Dup ncheierea unei tranzacii, urmtoarea tranzacie va ncepe automat la ntlnirea primei instruciuni SQL. Modificrile realizate de o instruciune LDD sunt salvate automat i de aceea ncheie n mod implicit o tranzacie.

Comenzi pentru controlul explicit al tranzaciilor


Logica tranzaciilor poate fi controlat cu ajutorul instruciunilor COMMIT, SAVEPOINT i ROLLBACK. Tranzacie INSERT COMMIT UPDATE INSERT DELETE

Punct salvare A

Punct salvare B ROLLBACK la punctul B ROLLBACK la punctul A ROLLBACK

Comand COMMIT SAVEPOINT nume ROLLBACK [TO SAVEPOINT nume]

Descriere ncheie actuala tranzacie, toate modificrile efectuate asupra datelor devenind permanente. Marcheaz un punct de ntoarcere n cadrul tranzaciei curente. Instruciunea ROLLBACK ncheie tranzacia curent pierzndu-se toate modificrile temporare asupra datelor. Instruciunea ROLLBACK TO SAVEPOINT nume terge punctul de ntoarcere specificat de nume i anuleaz toate schimbrile survenite dup el.

Procesarea implicit a tranzaciilor


Salvarea automat a modificrilor are loc n urmtoarele circumstane: - se execut o comand LDD; se prsete normal mediul SQL*Plus, fr a executa explicit instruciunea COMMIT sau ROLLBACK Un rollback automat se produce n condiiile unei terminri anormale a sesiunii SQL*Plus sau n cazul unei cderi a sistemului.

Not: n SQL*Plus este disponibil o a treia comand, instruciunea AUTOCOMMIT, ce poate fi setat ON sau OFF. Dac este setat pe ON, fiecare instruciune LMD conduce la salvarea modificrilor imediat ce este executat. n acest caz nu se mai poate reface starea anterioar (un rollback nu mai este posibil). Dac este setat pe OFF, instruciunea COMMIT poate fi executat explicit. De asemenea, COMMIT este executat odat cu o instruciune LDD sau la prsirea mediului SQL*Plus. Fiecare modificare efectuat n timpul unei tranzacii este temporar pn n momentul execuiei comenzii COMMIT. Starea datelor nainte de un COMMIT sau ROLLBACK: operaiile de manipulare a datelor afecteaz iniial buffer-ul bazei de date; de aceea, starea iniiala a datelor poate fi reconstituit; utilizatorul curent poate revedea schimbrile efectuate prin interogarea tabelelor; ali utilizatori nu pot vedea modificrile fcute de utilizatorul curent. Serverul Oracle asigur consistena datelor la citire pentru a se asigura c fiecare utilizator vede datele aa cum existau ele n momentul ultimei salvri. nregistrrile afectate de modificri sunt protejate (locked), astfel nct ali utilizatori s nu poat efectua modificri asupra lor.

Starea datelor dup execuia instruciunii COMMIT: modificrile asupra datelor sunt salvate n baza de date; starea anterioar a datelor nu mai poate fi restaurat; toi utilizatorii pot vedea rezultatele tranzaciei; protecia nregistrrilor modificate este nlturat; astfel, aceste nregistrri pot fi modificate de ali utilizatori; toate punctele de ntoarcere sunt terse.

Urmtorul exemplu creeaz un nou departament ADVERTISING cu cel puin un angajat i salveaz modificrile fcute.
SQL> INSERT INTO department(deptno, dname, loc) 2 VALUES (50, 'ADVERTISING','MIAMI'); SQL> UPDATE employee 2 SET deptno = 50 3 WHERE empno = 7876; SQL> COMMIT;

1 row created.

1 row updated.

Commit complete.

Anularea modificrilor (refacerea strii iniiale) Anularea modificrilor temporare se face cu ajutorul instruciunii ROLLBACK. Dup un ROLLBACK: modificrile efectuate sunt anulate; este refcut starea anterioar a datelor; este ridicat protecia asupra nregistrrilor implicate n tranzacie.

Ca exemplu, n ncercarea de a terge o nregistrare din tabelul emp, se poate ntmpla s tergem accidental ntregul tabel. Aceast greeal se poate corecta, urmnd ca apoi s se execute instruciunile corecte i s se salveze modificrile.
SQL> DELETE FROM emp; SQL> ROLLBACK; SQL> DELETE FROM emp 2 WHERE empno = 7902; 14 rows deleted. Rollback complete.

1 row deleted.

SQL> SELECT * 2 FROM emp 3 WHERE empno = 7902; SQL> COMMIT;

No rows selected.

Commit complete.

Anularea modificrilor pn la un punct de salvare


Crearea unui marcaj n cadrul tranzaciei curente se poate face cu ajutorul instruciunii SAVEPOINT. Astfel, tranzacia poate fi mprit n seciuni mai mici, oferind posibilitatea anulrii modificrilor temporare pn la acel marcaj folosind instruciunea ROLLBACK TO SAVEPOINT nume_savepoint. Dac se creeaz un al doilea punct de salvare cu acelai nume ca unul anterior, punctul anterior de salvare este ters.
SQL> UPDATE SQL> SAVEPOINT update_done; SQL> INSERT SQL> ROLLBACK TO update_done; Rollback complete. Savepoint created.

Instruciunea ROLLBACK anterioar va anula modificrile efectuate de instruciunea INSERT.

Rollback la nivel de comand


Se poate anula o parte din tranzacie printr-un rollback implicit dac este detectat o eroare la execuia unei instruciuni. Dac o singur instruciune LMD eueaz n timpul execuiei unei tranzacii, efectul ei este anulat printr-un rollback la nivel de comand, dar schimbrile efectuate de comenzi anterioare nu vor fi anulate. Ele pot fi salvate (COMMIT) sau anulate (ROLLBACK) n mod explicit de ctre utilizator. Oracle execut o comand COMMIT implicit nainte i dup orice comand LDD. n cazul n care o instruciune LDD nu se execut cu succes, nu pot fi anulate instruciunile anterioare pentru c serverul a executat un COMMIT.

Consistena la citire
Utilizatorii unei baze iniiaz dou tipuri de acces la baza de date: operaii de citire (instruciunea SELECT); operaii de scriere (instruciunile INSERT, UPDATE, DELETE).

Consistena la citire este necesar pentru ca: utilizatorii care citesc / modific datele s aib o vedere consistent asupra datelor; utilizatorii care citesc datele s nu vad datele care sunt n curs de modificare; utilizatorii care modific datele s aib sigurana c schimbrile n baza de date se fac n mod consistent; modificrile efectuate de un utilizator s nu intre n conflict sau s afecteze modificrile efectuate de un alt utilizator.

Scopul consistenei la citire este s asigure c fiecare utilizator vede datele n starea n care erau la ultima salvare, nainte de execuia unei instruciuni LMD.

Implementarea consistenei la citire


Consistena la citire este o implementare automat ce pstreaz o copie parial a bazei de date n segmente de rollback. Cnd se realizeaz o operaie de inserare, actualizare sau tergere asupra bazei de date serverul Oracle copie datele, nainte de modificare, ntr-un segment de rollback. Toi utilizatorii, cu excepia celui care a iniiat modificarea, vd baza de date n starea anterioar nceperii modificrii; de fapt ei vd copia datelor iniiale din segmentul de rollback. Cnd rezultatul unei instruciuni LMD este salvat, modificarea din baza de date devine vizibil oricrui utilizator ce execut o instruciune SELECT. Spaiul ocupat de datele vechi din segmentul de rollback este eliberat pentru a fi reutilizat. Dac tranzacia este anulat, modificrile sunt la rndul lor anulate: datele originale din segmentul rollback sunt rescrise n tabel; toi utilizatorii vd baza de date aa cum era nainte de nceperea tranzaciei.