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: