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.

