Autonoomne tehing sisse Oracle PL / SQL
⚡ Nutikas kokkuvõte
Tehingute kontrolli avaldused Oracle PL/SQL, nimelt COMMIT, ROLLBACK ja SAVEPOINT, otsustavad, kas ootel olevad DML-i muudatused salvestatakse või tühistatakse. Autonoomne tehing töötab sõltumatu alamprogrammina, mis kinnitab või tühistab muudatused põhitehingust eraldi.

Mis on TCL-laused PL/SQL-is?
TCL on lühend sõnadest Transaction Control Statements. Need laused salvestavad ootel olevad tehingud või tühistavad ootel olevad tehingud. Neil on oluline roll, sest kui tehingut ei salvestata, siis tehtud muudatused... DML avaldused ei salvestata andmebaasi jäädavalt. Allpool on toodud erinevad TCL-laused PL / SQL.
| väljavõte | Kirjeldus |
|---|---|
| KOHUSTUS | Salvestab kõik pooleliolevad tehingud. |
| TAGASI | Tühistab kõik ootel olevad tehingud. |
| SAVEPOINT | Loob tehingus punkti, milleni saab hiljem tagasipööramise teha. |
| TAGASI | Kustutab kõik ootel tehingud kuni määratud salvestuspunktini. |
Tehing viiakse lõpule järgmistel juhtudel:
- Kui väljastatakse mõni ülaltoodud lausetest (välja arvatud SAVEPOINT).
- DDL-lausete väljastamisel (DDL-laused on automaatse kinnitamise laused).
- DCL-lausete väljastamisel (DCL-laused on automaatse kinnitamise laused).
SAVEPOINTi ja ROLLBACK TO kasutamine
Ülaltoodud tabel tutvustab funktsioone SAVEPOINT ja ROLLBACK TO ning koos annavad need teile osalise kontrolli tehingu üle. SAVEPOINT tähistab nimetatud punkti praeguses tehingus. Hilisem ROLLBACK TO sellele salvestuspunktile tühistab kõik pärast seda tehtud muudatused, samas kui keeping enne seda tehtud töö puutumata.
See on kasulik, kui pikk tehing sooritab mitu SQL sammu ja ainult viimane samm ebaõnnestub. Kogu tehingu hülgamise asemel saate tagasi pöörduda viimase hea salvestuspunkti juurde ja jätkata.
süntaksit:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Salvestuspunktide kohta meeles pidada järgmisi punkte:
- SAVEPOINT eksisteerib ainult praeguse tehingu sees; COMMIT või täielik ROLLBACK kustutab kõik salvestuspunktid.
- Salvestuspunktile tagasipöördumisel kustutatakse kõik pärast seda loodud salvestuspunktid, kuid tagasipöördumisele eelnenud salvestuspunkt jääb alles.
- ROLLBACK TO ei lõpeta tehingut; enne salvestuspunkti tehtud muudatused jäävad ootele, kuni te käsu COMMIT või ROLLBACK kasutate.
- Kui kasutate salvestuspunkti nime uuesti, liigutab uuem SAVEPOINT markerit hilisemale positsioonile.
Kuna ROLLBACK TO jätab tehingu avatuks, otsustate lõpuks ikkagi, kas ülejäänud muudatused COMMIT'ida või need täieliku ROLLBACK'iga tühistada.
Mis on autonoomne tehing
PL/SQL-is nimetatakse kõiki andmetes tehtud muudatusi tehinguks. Tehing loetakse lõpule viidud, kui sellele rakendatakse salvestamise või kustutamise käsku. Kui salvestamist või kustutamist ei tehta, siis tehingut ei loeta lõppenuks ja andmetes tehtud muudatusi ei tehta serveris püsivaks.
Vaikimisi käsitleb PL/SQL kõiki seansi ajal tehtud muudatusi ühe tehinguna ning selle tehingu salvestamine või tühistamine mõjutab kõiki seansi ootel olevaid muudatusi. Autonoomne tehing annab arendajale võimaluse teha muudatusi eraldi tehingus ning salvestada või tühistada see konkreetne tehing ilma põhiseansi tehingut mõjutamata.
- Autonoomse tehingu saab määrata alamprogrammi tasandil.
- Et teha mis tahes alamprogramm töötaks teises tehingus, tuleks märksõna PRAGMA AUTONOMOUS_TRANSACTION anda selle ploki deklaratiivses osas.
- See annab kompilaatorile juhised käsitleda seda eraldi tehinguna ning selle ploki sees salvestamine või kustutamine ei kajastu põhitehingus.
- Enne sellest autonoomsest tehingust lahkumist ja põhitehingu juurde naasmist on kohustuslik COMMIT või ROLLBACK käsk, sest igal ajahetkel saab aktiivne olla ainult üks tehing.
- Seega, kui autonoomne tehing on alustatud, tuleb see salvestada ja lõpule viia, enne kui kontroll saab tagasi põhitehingu juurde liikuda.
süntaksit:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
Ülaltoodud süntaksis on plokk muudetud autonoomseks tehinguks.
Näide 1: Selles näites mõistame, kuidas autonoomne tehing toimib.
Allolev ekraanipilt näitab seda autonoomset tehingu näidet ja selle väljundit Oracle.
DECLARE l_salary NUMBER; PROCEDURE nested_block IS PRAGMA autonomous_transaction; BEGIN UPDATE emp SET salary = salary + 15000 WHERE emp_no = 1002; COMMIT; END; BEGIN SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('Before Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('Before Salary of 1002 is'|| l_salary); UPDATE emp SET salary = salary + 5000 WHERE emp_no = 1001; nested_block; ROLLBACK; SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('After Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('After Salary of 1002 is '|| l_salary); end;
Väljund
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
Code Selgitus:
- Code rida 2: Deklareeritakse l_salary kui NUMBER.
- Code rida 3: Protseduuri nested_block deklareerimine.
- Code rida 4: Nested_block protseduuri muutmine AUTONOMOUS_TRANSACTION-iks.
- Code rida 7-9: Töötaja number 1002 palga tõstmine 15000 XNUMX võrra.
- Code rida 10: Autonoomse tehingu sooritamine.
- Code rida 13-16: Töötajate 1001 ja 1002 palgaandmete printimine enne muudatusi.
- Code rida 17-19: Töötaja number 1001 palga tõstmine 5000 XNUMX võrra.
- Code rida 20: Nested_block protseduuri kutsumine.
- Code rida 21: Põhitehingu tühistamine.
- Code rida 22-25: Töötajate 1001 ja 1002 palgaandmete printimine pärast muudatusi.
Töötaja numbriga 1001 palgatõus ei kajastu, kuna põhitehing on tühistatud. Töötaja numbriga 1002 palgatõus kajastub, kuna see plokk on tehtud eraldi tehinguna ja salvestatud lõpus.
Seega, olenemata põhitehingu salvestamisest või tühistamisest, salvestatakse autonoomse tehingu muudatused põhitehingut mõjutamata.
Millal autonoomseid tehinguid kasutada
Autonoomsed tehingud on võimsad, seega on kasulik teada, millal need sobivad. Reserveerige need töö jaoks, mis peab õnnestuma või ebaõnnestuma põhitehingust sõltumatult, mitte põhilise äriloogika jaoks. Levinud kasutusjuhud on järgmised:
- Auditi logimine: Salvesta, kes tundlikke andmeid muutis, millal ning vanad ja uued väärtused, et logi jääks alles ka siis, kui põhitehing tühistatakse.
- Viga logimisel: Kirjutage veakirje faili sisse erand käitleja ja kinnita see COMMIT-iga, nii et diagnostilised andmed säilivad, kuni ebaõnnestunud tehing tühistatakse.
- Loendurid ja statistika: Kasutusloenduri või tabamuste arvu edasiliikumine, mis peab jääma püsima olenemata helistaja tulemusest.
- COMMIT päästiku sees: Päästik ei saa COMMIT käsku otse väljastada; autonoomne tehing on ainus toetatud viis seda teha.
Väldi autonoomseid tehinguid tavaliste uuenduste puhul, mis peaksid jagama põhitehingu saatust. Nende ülekasutamine võib peita andmeid sõltumatute commit'ide taha ja muuta silumise raskemaks. Reeglina peab iga autonoomne plokk lõppema selgesõnalise COMMIT'i või ROLLBACK'iga.
Autonoomsed vs regulaarsed tehingud
Tavalise (põhi)tehingu ja autonoomse tehingu erinevus taandub ulatusele ja sõltumatusele. Allolev tabel võrdleb neid.
| Aspekt | Tavaline tehing | Autonoomne tehing |
|---|---|---|
| Ulatus | Jagab ühe seansi tehingut | Töötab eraldi alamtehinguna |
| COMMIT / ROLLBACK efekt | Mõjutab kõiki ootel olevaid seansi muudatusi | Mõjutab ainult autonoomset plokki |
| deklaratsioon | Vaikimisi käitumine | PRAGMA AUTONOMOUS_TRANSACTION deklaratiivses osas |
| Vanema tagasipööramise mõju | Muudatused lähevad kaotsi | Pühendunud autonoomsed muudatused säilitatakse |
| Tüüpiline kasutamine | Põhiline äriloogika | Audit ja vealogimine |
Erinevalt tavalisest pesastatud plokk, mille muudatused jagavad alati ümbritseva tehingu tulemust, seisab autonoomne plokk iseseisvalt. Selle erinevuse mõistmine aitab teil otsustada, millal peaks plokk olema iseseisev ja millal peaks see jagama peamise tehingu tulemust.

