Autonominen kauppa sisään Oracle PL / SQL

⚡ Älykäs yhteenveto

Transaktioiden hallintalausekkeet Oracle PL/SQL-käskyt, nimittäin COMMIT, ROLLBACK ja SAVEPOINT, päättävät, tallennetaanko vai hylätäänkö odottavat DML-muutokset. Autonominen tapahtuma suoritetaan itsenäisenä aliohjelmana, joka tekee vahvistuksen tai peruuttaa muutokset erikseen päätapahtumasta.

  • 💾 SITOUTUMINEN: Tekee kaikista vireillä olevista DML-muutoksista pysyviä, lopettaa tapahtuman, vapauttaa lukitukset ja poistaa kaikki tallennuspisteet.
  • ↩️ PERUUTUS: Kumoaa keskeneräiset muutokset, joko koko tapahtuman tai takaisin nimettyyn tallennuspisteeseen.
  • 📌 TALLENNUSPISTE: Merkitsee pisteen transaktion sisällä, jotta myöhempi ROLLBACK TO -käsky voi kumota vain osan työstä.
  • 🔀 Autonominen tapahtuma: PRAGMA AUTONOMOUS_TRANSACTION -direktiivin avulla aliohjelma voi tehdä commitin tai peruuttaa määritetyn toiminnon itsenäisesti.
  • 🧾 Käytä koteloita: Autonomiset tapahtumat sopivat tarkastus- ja virhelokiin, joiden on säilytettävä, vaikka päätyö peruuntuisi.
  • 🤖 AI-apu: Tekoälyavustajat, kuten GitHub Copilot, luonnostelevat COMMIT-, ROLLBACK- ja PRAGMA-lohkoja ja merkitsevät puuttuvia commit-merkintöjä.

Autonominen kauppa sisään Oracle PL/SQL COMMITin ja ROLLBACKin kanssa

Mitä ovat TCL-lausekkeet PL/SQL:ssä?

TCL on lyhenne sanoista Transaction Control Statements. Nämä lauseet joko tallentavat keskeneräiset tapahtumat tai peruuttavat keskeneräiset tapahtumat. Niillä on tärkeä rooli, sillä ellei tapahtumaa tallenneta, tehdyt muutokset... DML-lauseet ei tallenneta pysyvästi tietokantaan. Alla on lueteltu eri TCL-lausekkeet PL / SQL.

Lausunto Tuotetiedot
COMMIT Tallentaa kaikki keskeneräiset tapahtumat.
palautus Hylkää kaikki keskeneräiset tapahtumat.
SAVEPOINT Luo tapahtumaan pisteen, johon asti peruutus voidaan tehdä myöhemmin.
PALAUTUS TOSI Hylkää kaikki keskeneräiset tapahtumat määritettyyn tallennuspisteeseen asti.

Kauppa toteutetaan seuraavissa tilanteissa:

  • Kun jokin yllä olevista lausekkeista annetaan (paitsi SAVEPOINT).
  • Kun DDL-lausekkeita annetaan (DDL-lausekkeet ovat automaattisesti vahvistettavia lauseita).
  • Kun DCL-lausekkeita annetaan (DCL-lausekkeet ovat automaattisesti vahvistettavia lauseita).

SAVEPOINT- ja ROLLBACK TO -funktioiden käyttö

Yllä oleva taulukko esittelee SAVEPOINT- ja ROLLBACK TO -funktiot, ja yhdessä ne antavat sinulle osittaisen hallinnan tapahtumaan. SAVEPOINT merkitsee nimettyä pistettä nykyisen tapahtuman sisällä. Myöhempi ROLLBACK TO -toiminto kyseiseen tallennuspisteeseen kumoaa kaikki sen jälkeen tehdyt muutokset, kun taasping ennen sitä tehty työ ehjänä.

Tämä on hyödyllistä, kun pitkä tapahtuma suorittaa useita SQL vaiheita ja vain viimeinen vaihe epäonnistuu. Koko tapahtuman hylkäämisen sijaan voit palata viimeiseen toimivaan tallennuspisteeseen ja jatkaa.

Syntaksi:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Tärkeimmät muistettavat asiat tallennuspisteistä:

  • SAVEPOINT-komento on olemassa vain nykyisen tapahtuman sisällä; COMMIT tai täysi ROLLBACK poistaa kaikki tallennuspisteet.
  • Kun palautat tallennuspisteen, kaikki sen jälkeen luodut tallennuspisteet poistetaan, mutta palautuspiste säilyy.
  • ROLLBACK TO ei lopeta tapahtumaa; ennen tallennuspistettä tehdyt muutokset pysyvät odottamassa, kunnes teet COMMIT- tai ROLLBACK-komennon.
  • Jos käytät tallennuspisteen nimeä uudelleen, uudempi SAVEPOINT siirtää merkin myöhempään sijaintiin.

Koska ROLLBACK TO jättää tapahtuman avoimeksi, päätät silti lopussa, COMMITTATko loput muutokset vai hylkäätkö ne täydellä ROLLBACK-komennolla.

Mikä on autonominen transaktio

PL/SQL:ssä kaikkia dataan tehtyjä muutoksia kutsutaan transaktioiksi. Transaktiota pidetään täydellisenä, kun siihen sovelletaan tallennus- tai hylkäystoimintoa. Jos tallennus- tai hylkäystoimintoa ei anneta, transaktiota ei pidetä täydellisenä, eivätkä dataan tehdyt muutokset jää pysyviksi palvelimelle.

Oletusarvoisesti PL/SQL käsittelee kaikkia istunnon aikana tehtyjä muutoksia yhtenä tapahtumana, ja kyseisen tapahtuman tallentaminen tai hylkääminen vaikuttaa kaikkiin istunnon aikana tapahtuviin muutoksiin. Autonominen tapahtuma antaa kehittäjälle mahdollisuuden tehdä muutoksia erillisessä tapahtumassa ja tallentaa tai hylätä kyseisen tapahtuman vaikuttamatta pääistunnon tapahtumaan.

  • Autonominen tapahtuma voidaan määrittää aliohjelmatasolla.
  • tehdä mitä tahansa aliohjelma työskennellä eri transaktiossa, avainsana PRAGMA AUTONOMOUS_TRANSACTION tulee antaa kyseisen lohkon deklaratiivisessa osassa.
  • Se ohjeistaa kääntäjää käsittelemään tätä erillisenä tapahtumana, eikä tämän lohkon sisällä tapahtuva tallentaminen tai hylkääminen näy päätapahtumassa.
  • COMMIT- tai ROLLBACK-käskyn antaminen on pakollista ennen tästä itsenäisestä tapahtumasta poistumista ja palaamista päätapahtumaan, koska vain yksi tapahtuma voi olla aktiivinen kerrallaan.
  • Kun itsenäinen tapahtuma on aloitettu, se on tallennettava ja suoritettava loppuun ennen kuin hallinta voi siirtyä takaisin päätapahtumaan.

Syntaksi:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

Yllä olevassa syntaksissa lohkosta on tehty autonominen tapahtuma.

Esimerkki 1: Tässä esimerkissä aiomme ymmärtää, miten autonominen tapahtuma toimii.

Alla oleva kuvakaappaus näyttää tämän autonomisen tapahtuman esimerkin ja sen tulosteen Oracle.

Esimerkki itsenäisestä tapahtumasta, jossa sisäkkäinen lohko committoidaan, kun päätapahtuma palautuu takaisin 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;

ulostulo

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 Selitys:

  • Code rivi 2: Ilmoitetaan l_salary muodossa NUMBER.
  • Code rivi 3: nested_block-proseduurin määrittäminen.
  • Code rivi 4: Nested_block-proseduurin muuttaminen AUTONOMOUS_TRANSACTION-proseduuriksi.
  • Code rivi 7–9: Työntekijän 1002 palkan korotus 15000:lla.
  • Code rivi 10: Autonomisen tapahtuman vahvistaminen.
  • Code rivi 13–16: Työntekijöiden 1001 ja 1002 palkkatietojen tulostaminen ennen muutoksia.
  • Code rivi 17–19: Työntekijän 1001 palkan korotus 5000:lla.
  • Code rivi 20: Kutsutaan nested_block-proseduuria.
  • Code rivi 21: Päätapahtuman hylkääminen.
  • Code rivi 22–25: Työntekijöiden 1001 ja 1002 palkkatietojen tulostaminen muutosten jälkeen.

Työntekijän numero 1001 palkankorotus ei näy, koska päätapahtuma on hylätty. Työntekijän numero 1002 palkankorotus näkyy, koska kyseinen lohko on tehty erilliseksi tapahtumaksi ja tallennettu lopussa.

Joten riippumatta siitä, tallennetaanko vai hylätäänkö ne päätapahtumassa, autonomisen tapahtuman muutokset tallennetaan vaikuttamatta päätapahtumaan.

Milloin käyttää autonomisia tapahtumia

Autonomiset transaktiot ovat tehokkaita, joten on hyödyllistä tietää, milloin ne sopivat. Varaa ne työlle, jonka on onnistuttava tai epäonnistuttava päätransaktiosta riippumatta, ei ydinliiketoimintalogiikalle. Yleisiä käyttötapauksia ovat:

  • Tarkastuksen kirjaus: Kirjaa ylös kuka muutti arkaluonteisia tietoja, milloin sekä vanhat ja uudet arvot, jotta loki säilyy, vaikka päätapahtuma peruuntuisi.
  • Virheen lokikirjaus: Kirjoita virhetietue tiedoston sisälle poikkeus käsittelijä ja COMMIT sen, jotta diagnostiikkatiedot säilytetään epäonnistuneen tapahtuman hylätessä.
  • Laskurit ja tilastot: Ota käyttöön käyttölaskuri tai osumamäärä, jonka on pysyttävä voimassa soittajan tuloksesta riippumatta.
  • COMMIT liipaisimen sisällä: Liipaisin ei voi antaa COMMIT-käskyä suoraan; autonominen tapahtuma on ainoa tuettu tapa tehdä se.

Vältä autonomisia tapahtumia tavallisissa päivityksissä, joiden tulisi jakaa päätapahtuman kohtalo. Niiden liikakäyttö voi piilottaa tietoja itsenäisten commit-merkintöjen taakse ja vaikeuttaa virheenkorjausta. Pääsääntöisesti jokaisen autonomisen lohkon on päätyttävä eksplisiittiseen COMMIT- tai ROLLBACK-merkintään.

Autonomiset vs. säännölliset tapahtumat

Tavallisen (pää)tapahtuman ja itsenäisen tapahtuman välinen ero riippuu niiden laajuudesta ja itsenäisyydestä. Alla oleva taulukko vertailee niitä.

Aspect Normaali tapahtuma Itsenäinen kauppa
Laajuus Jakaa yhden istunnon tapahtuman Suoritetaan erillisenä alitapahtumana
COMMIT / ROLLBACK -vaikutus Vaikuttaa kaikkiin odottaviin istuntomuutoksiin Vaikuttaa vain autonomiseen lohkoon
Ilmoitus Oletuskäyttäytyminen PRAGMA AUTONOMOUS_TRANSACTION deklaratiivisessa osiossa
Ylätason palautuksen vaikutus Muutokset menetetään Sitoutuneet itsenäiset muutokset säilytetään
Tyypillinen käyttö Ydinliiketoimintalogiikka Tarkastus- ja virheloki

Toisin kuin tavallinen sisäkkäinen lohko, jonka muutokset jakavat aina ympäröivän tapahtuman tuloksen, autonominen lohko toimii itsenäisesti. Tämän eron ymmärtäminen auttaa sinua päättämään, milloin lohkon tulisi olla itsenäinen ja milloin sen tulisi jakaa päätapahtuman tulos.

UKK

Oracle nostaa ORA-06519-virheen ja peruuttaa autonomisen työn. Jokaisen autonomisen tapahtuman on päätyttävä eksplisiittiseen COMMIT- tai ROLLBACK-komennolla ennen kuin ohjaus palaa päätapahtumaan, koska vain yksi aktiivinen tapahtuma sallitaan kerrallaan.

Ei suoraan. Normaali liipaisin ei voi antaa COMMIT- tai ROLLBACK-käskyjä. Liipaisimen tai sen kutsuman proseduurin määrittäminen PRAGMA AUTONOMOUS_TRANSACTION -käskyllä ​​antaa liipaisimen vahvistaa omat muutoksensa riippumatta liipaisimen laukaissut lauseesta.

Ei. Kun päätapahtuma on jäädytetty, autonominen tapahtuma suoritetaan itsenäisesti eikä se voi nähdä päätapahtuman vahvistamattomia muutoksia. Se näkee vain tietokannassa jo vahvistetut tiedot, joten päätapahtuman lukituksen odottaminen voi aiheuttaa lukkiutumisen.

Kyllä. Jokainen DDL-lauseke, kuten CREATE, ALTER tai DROP, antaa implisiittisen COMMIT-lausekkeen ennen suoritustaan ​​ja sen jälkeen. Kaikki istunnon keskeneräiset DML-lausekkeet vahvistetaan automaattisesti, joten DDL-lauseketta ei voida peruuttaa jälkikäteen.

Autonominen lohko voi kutsua toista, ja jokainen hallitsee omaa COMMIT- tai ROLLBACK-kutsuaan. Oracle rajoittaa TRANSACTIONS-alustusparametrin avulla, kuinka monta tapahtumaa on samanaikaisesti aktiivisia, joten autonomisten lohkojen erittäin syvä sisäkkäisyys voi epäonnistua.

Ei. COMMIT tekee muutoksista pysyviä, vapauttaa lukitukset ja tyhjentää tallennuspisteet, joten sitä ei voi perua ROLLBACK-komennolla. Jos haluat peruuttaa commitoidut tiedot, sinun on suoritettava uusi DML. Käytä SAVEPOINT- ja ROLLBACK TO -komentoja osittaiseen perumiseen ennen committia.

Kyllä. GitHub Copilot luo kommentista COMMIT- ja ROLLBACK-logiikan, SAVEPOINT-lohkot ja PRAGMA AUTONOMOUS_TRANSACTION -proseduurit. RevTarkastele commitin sijoittelua ja virheiden käsittelyä, koska väärin sijoitettu commit voi vääristää transaktiorajoja.

Tekoälyavustajat skannaavat proseduureja puuttuvien tai väärin sijoitettujen COMMIT- ja ROLLBACK-lausekkeiden varalta, tekevät commit-muutoksia silmukoiden sisällä ja sulkemattomia autonomisia lohkoja. Tämä koneoppimiseen perustuva tarkistus merkitsee transaktiovirheitä ja ehdottaa turvallisempia rajoja ennen kuin koodi pääsee tuotantoon.

Tiivistä tämä viesti seuraavasti: