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.

  • 💾 KOHANE: Muudab kõik ootel olevad DML-i muudatused püsivaks, lõpetab tehingu, vabastab lukud ja kustutab kõik salvestuspunktid.
  • ↩️ TAGASIPÖÖRDUMINE: Tühistab ootel olevad muudatused, kas kogu tehingu või tagasi nimega SAVEPOINT-ini.
  • 📌 SÄÄSTUPUNKT: Märgib tehingu sees punkti, nii et hilisem ROLLBACK TO saab tagasi võtta ainult osa tööst.
  • 🔀 Autonoomne tehing: Direktiiv PRAGMA AUTONOMOUS_TRANSACTION lubab alamprogrammil iseseisvalt muudatusi teha või tagasi võtta.
  • 🧾 Kasutusjuhtumid: Autonoomsed tehingud sobivad auditi ja vealogi jaoks, mis peavad säilima isegi siis, kui põhitöö tühistatakse.
  • 🤖 AI abi: Tehisintellekti assistendid, näiteks GitHub Copilot, mustandavad COMMIT-, ROLLBACK- ja PRAGMA-plokke ning märgistavad puuduvad commit'id.

Autonoomne tehing sisse Oracle PL/SQL koos COMMIT ja ROLLBACK-iga

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.

Autonoomse tehingu näide, mis kinnitab pesastatud ploki, samal ajal kui peamine tehing tagasi kerib Oracle PL / SQL

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.

KKK

Oracle tekitab ORA-06519 ja tühistab autonoomse töö. Iga autonoomne tehing peab lõppema selgesõnalise COMMIT või ROLLBACK käsuga, enne kui kontroll naaseb põhitehingu juurde, sest korraga on lubatud ainult üks aktiivne tehing.

Mitte otse. Tavaline päästik ei saa anda COMMIT ega ROLLBACK käsku. Päästiku või selle kutsutava protseduuri deklareerimine PRAGMA AUTONOMOUS_TRANSACTION abil võimaldab sellel oma muudatused kinnitada sõltumatult käsklusest, mis päästiku käivitas.

Ei. Kui vanem on peatatud, töötab autonoomne tehing iseseisvalt ja ei näe vanemsüsteemi kinnitamata muudatusi. See näeb ainult andmebaasis juba kinnitatud andmeid, seega võib vanemsüsteemi lukustuse ootamine põhjustada ummikseisu.

Jah. Iga DDL-lause, näiteks CREATE, ALTER või DROP, väljastab enne ja pärast käivitamist kaudse COMMIT-i. Kõik seansi ootel olevad DML-id kinnitatakse automaatselt, seega ei saa DDL-lauset hiljem tagasi võtta.

Autonoomne plokk saab kutsuda teist ja igaüks haldab oma COMMIT-i või ROLLBACK-i. Oracle piirab TRANSACTIONS initsialiseerimisparameetri abil korraga aktiivsete tehingute arvu, seega võib autonoomsete plokkide väga sügav pesastamine ebaõnnestuda.

Ei. COMMIT muudab muudatused püsivaks, vabastab lukud ja kustutab salvestuspunktid, seega ei saa seda ROLLBACK-iga tagasi võtta. Kinnitatud andmete tagasivõtmiseks peate käivitama uue DML-i. Enne kinnitamist kasutage osaliseks tagasivõtmiseks SAVEPOINT-i ja ROLLBACK TO-d.

Jah. GitHubi koopia koostab kommentaarist COMMIT ja ROLLBACK loogika, SAVEPOINT plokid ja PRAGMA AUTONOMOUS_TRANSACTION protseduurid. RevVaadake commit'i paigutust ja veakäsitlust, kuna valesti paigutatud commit võib rikkuda tehingu piire.

Tehisintellekti assistendid skannivad protseduure puuduvate või valesti paigutatud COMMIT- ja ROLLBACK-lausete suhtes, teevad muudatusi tsüklite sees ja sulgemata autonoomsetes plokkides. See masinõppepõhine ülevaade märgistab tehinguvead ja pakub välja turvalisemad piirid enne koodi tootmiskeskkonda jõudmist.

Võta see postitus kokku järgmiselt: