Punct de salvare (SQL)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 28 ianuarie 2022; verificările necesită 3 modificări .

Savepoint (de la save point - în engleză  save point ) este o instrucțiune SQL care împarte o tranzacție în puncte de salvare logice. Este, de asemenea, o modalitate de a implementa sub-tranzacții (numite tranzacții imbricate) într-un sistem de gestionare a bazelor de date relaționale prin specificarea unui punct din cadrul unei tranzacții care poate fi „retrocedat” fără a afecta munca efectuată în tranzacție înainte de crearea punctului de salvare. Pot exista mai multe puncte de salvare într-o singură tranzacție. Punctele de salvare sunt utile pentru implementarea recuperării erorilor complexe în aplicațiile de bază de date. Dacă apare o eroare în timpul unei tranzacții cu mai multe operațiuni, aplicația se poate recupera din eroare (prin întoarcerea la un punct de salvare) fără a fi nevoie să anuleze întreaga tranzacție. Platforme acceptate:

Sintaxa SQL

Un punct de salvare poate fi declarat după cum urmează (folosind instrucțiunea SAVEPOINT ).

SAVEPOINT numele punctului de salvare

Un punct de salvare numit „savepoint_name” este setat în tranzacția curentă. Unii furnizori vă permit să utilizați puncte de salvare cu același nume într-o tranzacție, dar standardul ANSI nu recomandă acest lucru.

Toate modificările făcute după ce punctul de salvare a fost declarat pot fi anulate prin lansarea comenzii:

ROLLBACK LA nume_punct de salvare _

Pentru a șterge unul sau mai multe puncte de salvare, utilizați comanda:

RELEASE SAVEPOINT numele punctului de salvare

Este important de reținut că toate punctele de salvare care au fost create după cel specificat vor fi, de asemenea, șterse.

Cum punctele de salvare [

Un punct de salvare (denumit în continuare TS) este o structură de date situată în memoria dinamică a serverului (în pool-ul de tranzacții) și având un identificator numeric unic. Fiecare vehicul are o listă de acțiuni efectuate în contextul său (așa-numitul jurnal de anulare sau jurnal de anulare). În cadrul unei tranzacții, TS formează o stivă și, prin urmare, derularea lor este întotdeauna posibilă numai secvenţial. Fragmente din jurnalul de anulare sunt distribuite între TO, care stochează progresiv istoricul tuturor modificărilor făcute în contextul tranzacției.

Un punct de salvare care este activ în momentul în care o înregistrare este schimbată se numește punctul de salvare curent. Informațiile despre modificarea intrării sunt plasate în jurnalul de anulare al vehiculului curent. În cazul inițierii unui rollback la TS, jurnalul de anulare este derulat în direcția opusă, reconstruind înregistrarea în forma în care exista la momentul instalării acestui TS. După reconstruirea tuturor înregistrărilor modificate, TS este de obicei eliminat din contextul tranzacției. Dacă în contextul TS-ului curent nu există gestionari de excepții, acest proces poate fi repetat, anulând modificările TS-ului superior. Pe lângă operațiunea de revenire la TS, există și operațiunea de îndepărtare (eliberare) obișnuită a TS. Dacă un vehicul este șters, jurnalul de anulare al acestuia este îmbinat cu jurnalul de anulare al celui anterior din stiva vehiculului. Având în vedere cele de mai sus, putem vorbi despre cuibărirea TS.

Sfaturi și note despre utilizare

Punctele de salvare sunt setate în cadrul tranzacției în care sunt definite. Numele punctelor de salvare trebuie să fie unice în aceste limite. Folosiți instrucțiunile BEGIN și COMMIT cu grijă, deoarece dacă puneți accidental o instrucțiune BEGIN prea devreme sau o instrucțiune COMMIT prea târziu, aceasta poate afecta foarte mult modul în care tranzacțiile sunt scrise în baza de date. Asigurați-vă că alegeți nume semnificative pentru punctele de salvare, deoarece vă veți referi la ele mai târziu în programele dvs. Reutilizarea unui nume de punct de salvare nu va avea ca rezultat o eroare sau un avertisment. Dublarea unui nume va face ca un punct de salvare anterior cu același nume să fie inoperabil. Aveți grijă când alegeți nume pentru punctele de salvare! Atunci când o tranzacție este începută, sunt cheltuite resurse (și anume încuietori) care asigură integritatea tranzacțiilor. Tranzacția dvs. trebuie să se finalizeze cât mai curând posibil, astfel încât blocările să fie eliberate și alți utilizatori să poată utiliza resursele.

Exemplu

Pentru a reveni la un punct de salvare după ce au fost făcute unele modificări, introduceți următoarele comenzi:

INSERT INTO sales VALUES ( 7896 ', ' JR3435 ', ' Oct 28 1997 ', 25, ' Net 60 ', ' BU7832 '); SAVEPOINT after_insert; UPDATE sales SET terms=' Net 90 ' WHERE sales_id=' 7896 ' ; SAVEPOINT after_update ; ȘTERGE vânzări ; ROLLBACK TO after_insert ;

După cum putem vedea, comanda ROLLBACK este cea care se întoarce la punctul de salvare numit „after_insert”.

De asemenea, un exemplu că putem crea mai multe puncte de salvare (în exemplu sunt setate două puncte de salvare, la care ne putem întoarce folosind comanda ROLLBACK ):

UPDATE angajati SET salariu = 7000 WHERE last_name = 'Banda' ; SAVEPOINT banda_sal ; UPDATE angajati SET salariu = 12000 WHERE last_name = 'Greene' ; SAVEPOINT greene_sal ; SELECTAȚI SUMA ( salariu ) FROM angajați ; ROLLBACK LA SAVEPOINT banda_sal ; UPDATE angajati SET salariu = 11000 WHERE last_name = 'Greene' ; COMMIT ;

Un exemplu de ștergere a unui punct de revenire (exemplul arată clar funcționarea comenzii RELEASE SAVEPOINT ):

INSERT autori ( au_id , au_lname , au_fname , contract ) VALUES ( '111-11-1111' , 'Rabbit' , 'Jessica' , 1 ); SAVEPOINT primul_punct_salvare ; INSERT autori ( au_id , au_lname , au_fname , contract ) VALORI ( '277-27-2777' , 'Fudd' , 'EP' , 1 ); SAVEPOINT secund_punct_salvare ; INSERT autori ( au_id , au_lname , au_fname , contract ) VALORI ( '366-36-3636' , 'Duck' , 'PJ' , 1 ); SAVEPOINT al treilea punct_salvare ; RELEASE SAVEPOINT secunde_savepoint ; COMMIT ;

În acest exemplu, când punctul de salvare second_savepoint este șters, sistemul șterge de fapt secund_savepoint și third_savepoint deoarece al treilea_savepoint a fost creat după second_savepoint. După ștergerea unui punct de salvare, numele acestuia poate fi folosit din nou.

Caracteristicile comenzii SAVEPOINT

UNIC

Specifică faptul că o aplicație nu poate reutiliza un nume de punct de salvare într-o unitate de recuperare. Dacă un punct de salvare cu același nume ca și numele punctului de salvare există deja în blocul de recuperare, va apărea o eroare. Omiterea UNIQUE indică faptul că aplicația poate reutiliza numele punctului de salvare în unitatea de recuperare. Dacă numele-svpt identifică un punct de salvare care există deja în unitatea de recuperare și punctul de salvare nu a fost creat cu opțiunea UNIQUE, punctul de salvare existent va fi distrus și va fi creat un nou punct de salvare. Distrugerea unui punct de salvare pentru a-i reutiliza numele nu este același lucru cu eliberarea unui punct de salvare. Reutilizarea unui nume de punct de salvare distruge doar un punct de salvare. Puteți elibera un punct de salvare folosind instrucțiunea RELEASE SAVEPOINT, care va elibera punctul de salvare, precum și orice puncte de salvare care au fost setate ulterior.

ON ROLLBACK RETAIN CURSORS

Specifică faptul că niciun cursor care este deschis după salvarea punctului de salvare nu este urmărit și, prin urmare, nu este închis la revenirea la punctul de salvare. Deși aceste cursore rămân deschise după o deplasare la un punct de salvare, este posibil să nu fie utilizate. De exemplu, dacă o derulare înapoi la un punct de salvare determină o inserare a rândului în care este plasat cursorul, atunci folosirea cursorului pentru a actualiza sau șterge rândul duce la o eroare.

ON ROLLBACK RETAIN LOCKS

Specifică faptul că orice blocări care au fost obținute de când punctul de salvare a fost salvat nu sunt urmărite și, prin urmare, nu sunt eliminate atunci când punctul de salvare este derulat înapoi. ON ROLLBACK RETAIN LOCKS este comportamentul implicit.

Literatură

Link -uri

  • [1] , Database SQL Reference, Oracle
  • [2] , DB2 SQL, IBM