Transaction Management în Oracle

Oracle este axat pe utilizarea tranzacției, cu alte cuvinte, se utilizează tranzacții pentru a asigura integritatea datelor. TRANSACTION - este o serie de operațiuni de manipulare a datelor SQL care realizează unitatea logică de lucru. De exemplu, două operațiuni UPDATE împrumuta un cont bancar, și un alt debitiruyut. La un moment dat de timp sau Oracle face permanent sau anulează toate modificările la baza de date, tranzacția. În cazul în care programul devine oprit în mijlocul unei tranzacții, Oracle detectează o eroare și efectuează anulare (retroactivitate) tranzacții. Prin urmare, baza de date va reveni automat la starea sa anterioară.

Pentru a gestiona tranzacții folosind comanda COMMIT, ROLLBACK, SAVEPOINTiSETTRANSACTION. COMMIT face permanent toate modificările aduse în baza de date a făcut în timpul tranzacției curente ( „confirma“ tranzacție) .Before timp cât nu confirma modificările, utilizatorii nu le pot vedea. ROLLBACK încheie tranzacția curentă și anulează toate modificările făcute de aceasta a început. SAVEPOINT marchează punctul curent în procesarea tranzacțiilor. Împreună cu ROLLBACK, SAVEPOINT comanda va permite să anulați o parte a unei tranzacții. TRANZACȚII SET stabilește modul de tranzacție

Procesarea tranzacției

Prima declarație SQL în programul începe o tranzacție. Atunci când se încheie o tranzacție, următoarea instrucțiune SQL pornește automat tranzacția următoare. Astfel, fiecare propoziție SQL face parte dintr-o tranzacție.

Oferta COMMIT încheie tranzacția curentă și face permanent toate modificările făcute în timpul acestei tranzacții. Până în acest moment, alți utilizatori nu pot vedea datele modificate; ei văd datele în aceeași stare ca la începutul tranzacției.

Luați în considerare o tranzacție simplă, care realizează transferul de bani dintr-un cont bancar la altul. Această tranzacție necesită două operațiuni de actualizare (update), deoarece acesta trebuie să debita un singur cont și de credit cealaltă. După creditarea al doilea cont emite o comandă COMMIT, ceea ce face schimbarea permanentă. Numai după aceea noul stat a conturilor este vizibil pentru alți utilizatori.

accts UPDATE SET bal = my_bal - debit

UNDE acctno = 7715;

accts UPDATE SET credit BAL = my_bal +

UNDE acctno = 7720;

WORK cuvânt cheie opțional are nici un efect, în plus față de a îmbunătăți lizibilitatea.

COMMIT de presă Oferta încuietori de masă și rând. De asemenea, se șterg toate savepoints (discutate mai jos), a remarcat după COMMIT sau ROLLBACK ultima.

Oferta de vizavi ROLLBACK COMMIT. Se termină tranzacția curentă și anulează toate modificările efectuate în timpul acestei tranzacții. Propunerea ROLLBACK este utilă din două motive.:

Dacă faceți o greșeală, de exemplu, au eliminat rândul greșit din baza de date, puteți utiliza ROLLBACK pentru a restaura datele originale. Opțiunea ROLLBACKTOpozvolyaet vă anulați modificările la un punct intermediar în tranzacție curentă, astfel încât nu trebuie să șteargă toate modificările.

ROLLBACK oferă util atunci când începe o tranzacție care nu este în măsură să finalizeze, de exemplu, în instrucțiunea SQL sau o eroare de excepție. În astfel de cazuri, revocați vă permite să se întoarcă la punctul de plecare, astfel încât să puteți lua măsuri corective și încercați din nou din nou tranzacția.

Luați în considerare următorul exemplu în care se introduce informații despre un angajat în trei tabele de baze de date diferite. Toate cele trei tabele au o coloană care conține numărul angajaților și limitează un index unic. Dacă instrucțiunea INSERT încearcă să inserați numărul duplicat angajat, ridică DUP_VAL_ON_INDEX excepție predefinită. În acest caz, trebuie să anulați toate modificările. Prin urmare, emite o ROLLBACK în handler excepție.

SELECT EMPNO. ÎN emp_id. DE LA new_emp UNDE.

INSERT INTO VALORI PMM (emp_id.);

INSERT în valori fiscale (emp_id.);

INSERT în valori de plată (emp_id.);

CÂND DUP_VAL_ON_INDEX ATUNCI

Recoils la nivelul propunerilor

Înainte de a executa o instrucțiune SQL, Oracle oferă un punct de salvare implicită. Apoi, în cazul în care această propunere se rătăcește, Oracle execută automat derularea înainte. De exemplu, în cazul în care o instrucțiune INSERT încearcă să introducă o valoare duplicat într-un index unic, este derulată înapoi. În acest caz, numai munca este pierdut, a început huddling oferta SQL; toate lucrările efectuate în tranzacție curentă până la acest punct, nu este afectată.

Înainte de a executa o instrucțiune SQL, Oracle trebuie să îndeplinească cazul său (parse), adică examinați-l pentru a se asigura că este corect sintactic și se referă la obiecte de baze de date valide. Erori detectate în timp ce parsing Exemple (spre deosebire de run-time erori) nu conduc la o revenire.

Numele SAVEPOINT și marchează punctul curent (cu excepția punct) în procesul de tranzacție. Acest punct este utilizat în ROLLBACK la pedeapsa vă permite să anulați o parte a unei tranzacții. În exemplul următor, marcați o savepoint înainte de a efectua Inserare rând. Dacă instrucțiunea INSERT încearcă să introducă o valoare duplicat în coloana EMPNO, există predefinite DUP_VAL_ON_INDEX excepție. În acest caz, reveniți la punctul de a salva, anulând o cutie.

UPDATE emp SET. UNDE EMPNO = emp_id;

DELETE FROM emp WHERE.

INSERT INTO VALORI PMM (emp_id.);

CÂND DUP_VAL_ON_INDEX ATUNCI

ROLLBACK TO do_insert;

Când ROLLBACK TO toate savepoints marcate declarat după șterse, iar toate modificările efectuate după acest moment sunt eliminate. Cu toate acestea, însăși păstrarea punctului la care vă întoarceți, nu este eliminat. De exemplu, dacă va nota secvențial stoca punctul A, B, C și D, și apoi efectuați ROLLBACK TO la punctul B, acesta va fi șters doar C și D.

ROLLBACK fără argumente, ca un COMMIT, șterge toate puncte de salvare.

Dacă marcați un punct de salvare într-o rutină recursiv, apoi la fiecare nivel al propunerii recursive SAVEPOINT coborâre va crea noi cazuri de puncte de salvare. Cu toate acestea ROLLBACK TO vă va duce doar la cel mai recent cu numele punctului de salvare dat.

Nume savepoints - acest lucru neanunțate identificatori. Acestea pot fi reutilizate în cadrul unei tranzacții. În acest punct salva este deplasat din poziția sa de vechi la punctul curent în tranzacție. Astfel, o revenire la punctul de salvare afectează numai partea curentă a tranzacției. Luați în considerare următorul exemplu:

UPDATE emp SET. UNDE EMPNO = emp_id;

my_point SAVEPOINT; - se mută la punctul my_point curent

INSERT INTO VALORI PMM (emp_id.);

Când alții APOI

ROLLBACK TO my_point;

În mod implicit, numărul de puncte de salvare activ pe sesiune nu poate fi mai mare de 5. ACTIVE litera salva - un punct menționat după COMMIT sau ROLLBACK ultima. Tu sau DBA poate ridica această limită (până la 255), creșterea valorii parametrului de inițializare ORACLE Savepoints numit.

Implicit salva puncte

Înainte de fiecare INSERT, UPDATE, DELETE și ORACLE creează un punct de salvare implicită (disponibilă pentru dvs.). În cazul în care propunerea se rătăcește, este readusă la punctul implicit. numai huddling declarație SQL este de obicei anulat, dar nu întreaga tranzacție.

O bună practică de programare este să confirme în mod explicit sau rollback explicită a fiecărei tranzacții. Dacă neglijați să compenseze tranzacții COMMIT sau ROLLBACK, determină starea finală a bazei de date de tranzacție în sine.

De exemplu, în cazul în care PL / SQL bloc nu conține propuneri de comiteri sau derulări înapoi, este starea finală a tranzacției depinde de ceea ce faci după această unitate:

Dacă efectuați etapele de determinare a datelor, operațiunile de gestionare a datelor sau COMMIT operațiune, sau dacă lansați comanda EXIT, Disconnect sau QUIT,

Oracle este confirmă implicit tranzacția.

Dacă emiteți o operație ROLLBACK sau o sesiune de fotografiere de urgență

ORACLEvypolnyaet apoi se rostogolească înapoi tranzacția.

IspolzovanieSETTRANSACTION

Modul silențios pentru toate tranzacțiile este consistența datelor citite-LEVEL OPERATsII.T.e. Cererea vede doar starea de date care a fost înainte de începerea executării sale, plus toate modificările aduse la operația anterioară în tranzacție curentă. În cazul în care, în timpul interogarea altor utilizatori (tranzacție) face modificări la aceeași masă de bază de date, aceste modificări vor fi vizibile numai urmat, dar nu și curent o singură cerere.

Puteți, totuși, emiterea unui set TRANSACTION propunere, să stabilească consecvența în modul de citire la nivel de tranzacție. Acest lucru asigură că interogarea vede doar starea datelor, care a fost confirmat înainte de începerea întregii tranzacții; Cu toate acestea, tranzacția nu ar trebui să facă orice modificări în baza de date. Oferta SET TRANSACTION Numai citire nu acceptă parametri suplimentari și are forma:

SET TRANSACTION CITEȘTE DOAR;

Suma licitată TRANZACȚII SET ar trebui să fie primul care să ofere tranzacții SQL și doar o singură dată pentru fiecare tranzacție poate avea loc. După cum sa menționat deja, în acest mod, toate tranzacție cererile emise în

ea vede starea datelor, care a fost confirmat înainte de începerea întregii tranzacții. modul citire nu afectează alți utilizatori sau alte tranzacții.

Numai citire tranzacții sunt permise doar o instrucțiune SELECT, COMMITiROLLBACK. Alte propuneri, cum ar fi, INSERT sau Ștergețidin, duce la excluderea excitației.

În timpul tranzacției doar pentru citire toate cererile sale se referă la aceeași bază de date instantaneu, care oferă mese multiple, mnogozaprosnoe, o vizualizare citire consistentă a datelor pentru tranzacție. Alți utilizatori pot continua să interogheze sau să actualizeze datele, ca de obicei.

O tranzacție este încheiată emiterea doar pentru citire comiteri sau derulări înapoi. În exemplul dumneavoastră, ca depozit de manager, folosind tranzacție doar pentru citire, pentru a colecta date cu privire la vânzări pe zi, săptămâna trecută și luna trecută. Aceste cifre nu pot afecta alți utilizatori actualizarea bazei de date în timpul

SET TRANSACTION CITEȘTE DOAR;

SUM SELECT (amt) în daily_sales din vânzări

UNDE DTE = SYSDATE;

SUM SELECT (amt) în weekly_sales din vânzări

UNDE DTE> SYSDATE - 7;

SUM SELECT (amt) în monthly_sales din vânzări

COMMIT; - este pur și simplu un semnal de finalizare a tranzacției, deoarece orice modificări pe care le face

Override bloc silențios

În mod implicit, Oracle blochează automat pentru structura de date. Cu toate acestea, puteți solicita un bloc de rânduri sau tabele, daca dintr-un motiv sau benefic pentru a schimba modul de blocare este silențios. blocare Explicit vă permite să vă permite sau refuza accesul partajat la masa la momentul tranzacției.

Utilizarea FOR UPDATE

CURSOR c1 IS EMPNO SELECT, FROM emp sal

UNDE = locuri de muncă 'SALESMAN' ȘI comm> vanza FOR UPDATE;

UPDATE emp SET vanza = new_sal;

Expresia FOR UPDATE indică faptul că șirul, selectați interogarea va fi actualizat sau șters, și blochează toate rândurile din setul activ al cursorului. Acest lucru este util atunci când doriți să actualizați în funcție de valoarea curentă a șirului. În acest caz, aveți nevoie de o garanție că linia nu va fi modificată de către un alt utilizator, înainte de upgrade. Toate rândurile din setul activ sunt blocate în momentul este deschis cursorul și deblocat atunci când COMMIT.

Între COMMIT'ami Extracting

Fraza FOR UPDATE cere rânduri de blocare exclusive. Toate rândurile din setul activ sunt blocate

în timpul deschiderii cursorului, mai degrabă decât în ​​timpul extracției lor. Toate liniile sunt eliberate după finalizarea tranzacției (COMMIT sau ROLLBACK). Prin urmare, nu puteți prelua rânduri dintr-un cursor declarat, pentru UPDATE, după COMMIT. Dacă încercați să faceți acest lucru, are loc o excepție. Luați în considerare următorul ciclu FOR, care bat după inserția zecea:

CURSOR c1 IS SELECT ename DIN emp PENTRU ACTUALIZAREA vanza;

PENTRU emp_rec ÎN LOOP c1 - operațiuni implicite FETCH

INSERT în valori temp (ctr, 'încă de lucru');

IF ctr> = 10 ATUNCI

COMMIT; - Comunicate de ecluze

Dacă aveți de gând să efectuați o COMMIT, fără a finaliza toate extracțiile, nu folosesc expresia FOR UPDATE.

Dacă nu se utilizează expresia PENTRU UPDATE, eliminați linia nu este blocat. Deci, poți

obține rezultate contradictorii în cazul în care un alt utilizator modifică un rând după ce ați citit-o, dar înainte de a se modifica.

Utilizarea LOCK TABLE

Oferta LOCK TABLE vă permite să blocați unul sau mai multe tabele în acest mod, astfel încât să puteți regla accesul simultan la mese, păstrând integritatea lor. De exemplu, propunerea prezentată mai jos, blocuri în modul tabelul emp parts rând. Acest mod permite accesul concurent la masa, dar împiedică alți utilizatori să blocheze întreaga masă pentru utilizare exclusivă. blocare Tabelul este eliberat atunci când tranzacția emite un COMMIT sau ROLLBACK.

emp TABELUL DE BLOCARE ÎN ROW SHARE MODE nowait;

Modul de blocare a determina ce alte tipuri de încuietori pot fi aplicate la masă. De exemplu, mai mulți utilizatori pot solicita simultan un sistem de blocare pentru cota rând aceeași masă, dar numai un singur utilizator la un moment dat poate solicita un monopol de blocare (exclusiv). În timp ce un utilizator are o blocare exclusivă pe masă, alți utilizatori nu se poate schimba (INSERT, UPDATE sau DELETE) rânduri de acest tabel.

Opțional nowait cuvinte cheie precizează că, în cazul în care cererea LOCK TABLE nu poate fi satisfăcută cu (posibil deoarece tabela este deja blocat de un alt utilizator), tabelul LOCK va reveni de control pentru utilizator, în loc de așteptare pentru a satisface cererea. Dacă omiteți nowait cuvinte cheie, atunci ORACLE va aștepta pe masă; această așteptare nu a stabilit limite.