Autonóm tranzakció be Oracle PL / SQL

⚡ Okos összefoglaló

Tranzakcióvezérlő utasítások Oracle A PL/SQL, nevezetesen a COMMIT, ROLLBACK és SAVEPOINT utasítások döntik el, hogy a függőben lévő DML-módosítások mentésre vagy elvetésre kerülnek-e. Egy autonóm tranzakció független alprogramként fut, amely a fő tranzakciótól függetlenül véglegesít vagy visszagörget.

  • 💾 ELKÖTELEZETTSÉG: Véglegesíti az összes függőben lévő DML-módosítást, leállítja a tranzakciót, feloldja a zárolásokat és törli az összes mentési pontot.
  • ↩️ VISSZAGÖLTÉS: Visszavonja a függőben lévő módosításokat, akár a teljes tranzakciót, akár egy elnevezett SAVEPOINT-ra való visszaállítást.
  • 📌 MENTÉSI PONT: Megjelöl egy pontot a tranzakción belül, így egy későbbi ROLLBACK TO csak a munka egy részét vonhatja vissza.
  • 🔀 Autonóm tranzakció: A PRAGMA AUTONOMOUS_TRANSACTION direktíva lehetővé teszi egy alprogram számára, hogy magától commitolja vagy visszavonja a TRANSACTION műveletet.
  • 🧾 Használási esetek: Az autonóm tranzakciók alkalmasak auditálásra és hibanaplózásra, amelynek akkor is meg kell maradnia, ha a fő munka visszavonásra kerül.
  • 🤖 AI segítség: Az olyan mesterséges intelligencia asszisztensek, mint a GitHub Copilot, COMMIT, ROLLBACK és PRAGMA blokkokat terveznek, és jelzik a hiányzó commitokat.

Autonóm tranzakció be Oracle PL/SQL COMMIT és ROLLBACK függvényekkel

Mik azok a TCL utasítások a PL/SQL-ben?

A TCL a Transaction Control Statements (Transaction Control Statements) rövidítése. Ezek az utasítások vagy mentik a függőben lévő tranzakciókat, vagy visszavonják a függőben lévő tranzakciókat. Létfontosságú szerepet játszanak, mert ha egy tranzakciót nem mentenek, a végrehajtott módosítások... DML utasítások nem kerül véglegesen tárolásra az adatbázisban. Az alábbiakban a különböző TCL utasítások láthatók a PL / SQL.

nyilatkozat Leírás
ELKÖVETNI Menti az összes függőben lévő tranzakciót.
VISSZATÉRÉS Elveti az összes függőben lévő tranzakciót.
SAVEPONT Létrehoz egy pontot a tranzakcióban, ameddig később visszagörgetés végezhető.
VISSZA A Elveti az összes függőben lévő tranzakciót a megadott mentési pontig.

A tranzakció a következő esetekben fog lezárulni:

  • Amikor a fenti utasítások bármelyike ​​kiadásra kerül (a SAVEPOINT kivételével).
  • Amikor DDL utasításokat adnak ki (a DDL automatikus véglegesítési utasítások).
  • Amikor DCL utasításokat adnak ki (a DCL-ek automatikus véglegesítési utasítások).

A SAVEPOINT és a ROLLBACK TO használata

A fenti táblázat bemutatja a SAVEPOINT és a ROLLBACK TO függvényeket, amelyek együttesen részleges kontrollt biztosítanak egy tranzakció felett. A SAVEPOINT egy elnevezett pontot jelöl az aktuális tranzakción belül. Egy későbbi ROLLBACK TO művelet ugyanarra a mentési pontra visszavon minden utána végrehajtott módosítást, míg a keeping az előtte végzett munka épségben.

Ez akkor hasznos, ha egy hosszú tranzakció több műveletet hajt végre. SQL lépések, és csak az utolsó lépés hiúsul meg. A teljes tranzakció elvetése helyett visszaléphet az utolsó jó mentési pontra, és folytathatja.

Syntax:

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

A mentési pontokkal kapcsolatos legfontosabb tudnivalók:

  • Egy SAVEPOINT csak az aktuális tranzakción belül létezik; egy COMMIT vagy egy teljes ROLLBACK minden mentési pontot töröl.
  • Amikor visszaállítasz egy mentési pontot, az utána létrehozott mentési pontok törlődnek, de a visszaállított mentési pont megmarad.
  • A ROLLBACK TO parancs nem fejezi be a tranzakciót; a mentési pont előtt végrehajtott módosítások függőben maradnak, amíg a COMMIT vagy a ROLLBACK parancsot nem adod meg.
  • Ha újrafelhasznál egy mentési pont nevét, az újabb SAVEPOINT a jelölőt a későbbi pozícióba helyezi át.

Mivel a ROLLBACK TO nyitva hagyja a tranzakciót, a végén továbbra is eldöntheted, hogy COMMIT-olod-e a fennmaradó módosításokat, vagy egy teljes ROLLBACK-kel elveted őket.

Mi az autonóm tranzakció

A PL/SQL-ben az adatokon végrehajtott összes módosítást tranzakciónak nevezzük. Egy tranzakció akkor tekinthető befejezettnek, ha mentést vagy elvetést alkalmazunk rá. Ha nem történik mentés vagy elvetés, akkor a tranzakció nem tekinthető befejezettnek, és az adatokon végrehajtott módosítások nem kerülnek véglegesítésre a szerveren.

Alapértelmezés szerint a PL/SQL egyetlen tranzakcióként kezeli a munkamenet során végrehajtott összes módosítást, és a tranzakció mentése vagy elvetése a munkamenet összes függőben lévő változására hatással van. Egy autonóm tranzakció lehetővé teszi a fejlesztő számára, hogy egy külön tranzakcióban módosításokat végezzen, és az adott tranzakciót mentse vagy elvesse anélkül, hogy az befolyásolná a fő munkamenet-tranzakciót.

  • Egy autonóm tranzakció alprogram szinten adható meg.
  • Bármelyik elkészítéséhez alprogram egy másik tranzakcióban működik, akkor a PRAGMA AUTONOMOUS_TRANSACTION kulcsszót meg kell adni az adott blokk deklaratív szakaszában.
  • Arra utasítja a fordítót, hogy ezt külön tranzakcióként kezelje, és a blokkon belüli mentés vagy elvetés nem jelenik meg a fő tranzakcióban.
  • A COMMIT vagy ROLLBACK parancs kiadása kötelező az autonóm tranzakció elhagyása és a fő tranzakcióhoz való visszatérés előtt, mivel egyszerre csak egy tranzakció lehet aktív.
  • Tehát, ha egy autonóm tranzakció elindult, azt menteni és befejezni kell, mielőtt a vezérlés visszatérhetne a fő tranzakcióhoz.

Syntax:

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

A fenti szintaxisban a blokkot autonóm tranzakcióvá tették.

Példa 1: Ebben a példában megértjük, hogyan működik egy autonóm tranzakció.

Az alábbi képernyőkép ezt az autonóm tranzakciós példát és annak kimenetét mutatja be Oracle.

Autonóm tranzakciós példa, amely beágyazott blokkot véglegesít, miközben a fő tranzakció visszaáll 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;

teljesítmény

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 Magyarázat:

  • Code 2. sor: Az l_salary értékét SZÁM-ként deklarálja.
  • Code 3. sor: A nested_block eljárás deklarálása.
  • Code 4. sor: A nested_block eljárás AUTONOMOUS_TRANSACTION-né tétele.
  • Code 7-9. sor: Az 1002-es alkalmazott fizetésének emelése 15000 fővel.
  • Code 10. sor: Az autonóm tranzakció véglegesítése.
  • Code 13-16. sor: A 1001-es és 1002-es alkalmazottak fizetési adatainak kinyomtatása a változások előtt.
  • Code 17-19. sor: Az 1001-es alkalmazott fizetésének emelése 5000 fővel.
  • Code 20. sor: A nested_block eljárás meghívása.
  • Code 21. sor: A fő tranzakció elvetése.
  • Code 22-25. sor: A 1001-es és 1002-es alkalmazottak fizetési adatainak nyomtatása a változások után.

A 1001-es számú alkalmazott fizetésemelése nem tükröződik, mivel a fő tranzakciót elvetették. A 1002-es számú alkalmazott fizetésemelése tükröződik, mivel ezt a blokkot külön tranzakcióként kezelték és a végén mentették.

Tehát függetlenül a fő tranzakcióban történő mentéstől vagy elvetéstől, az autonóm tranzakcióban végrehajtott módosítások a fő tranzakció befolyásolása nélkül mentésre kerülnek.

Mikor használjunk autonóm tranzakciókat?

Az autonóm tranzakciók hatékonyak, ezért hasznos tudni, hogy mikor illenek bele. Tartsa fenn őket olyan feladatokhoz, amelyeknek a fő tranzakciótól függetlenül kell sikeresnek vagy sikertelennek lenniük, ne pedig az alapvető üzleti logikához. Gyakori használati esetek:

  • Audit naplózás: Jegyezze fel, hogy ki, mikor, valamint a régi és az új értékeket módosította-e az érzékeny adatokat, így a napló akkor is fennmarad, ha a fő tranzakció visszavonásra kerül.
  • Hibanaplózás: Hibarekord írása egy kivétel kezelőt és COMMIT-olja azt, így a diagnosztikai részletek megmaradnak, miközben a sikertelen tranzakció elvetésre kerül.
  • Számlálók és statisztikák: Hozz létre egy használatszámlálót vagy találatszámlálót, amelynek a hívó fél eredményétől függetlenül fenn kell maradnia.
  • COMMIT egy triggeren belül: Egy trigger nem adhat ki közvetlenül COMMIT utasítást; egy autonóm tranzakció az egyetlen támogatott módja ennek.

Kerüld az autonóm tranzakciókat a szokásos frissítéseknél, amelyeknek osztozniuk kellene a fő tranzakció sorsán. Túlzott használatuk független commitok mögé rejtheti az adatokat, és megnehezítheti a hibakeresést. Általános szabály, hogy minden autonóm blokknak explicit COMMIT vagy ROLLBACK utasítással kell végződnie.

Autonóm vs. rendszeres tranzakciók

A hagyományos (fő) és az autonóm tranzakciók közötti különbség a hatókörben és a függetlenségben rejlik. Az alábbi táblázat összehasonlítja őket.

Aspect Rendszeres tranzakció Autonóm Tranzakció
Kör Megoszt egy munkamenet-tranzakciót Külön gyermek tranzakcióként fut
COMMIT / ROLLBACK hatás Minden függőben lévő munkamenet-módosításra hatással van Csak az autonóm blokkot érinti
Nyilatkozat Alapértelmezett viselkedés PRAGMA AUTONOMOUS_TRANSACTION a deklaratív szakaszban
A szülő visszagörgetésének hatása A változtatások elvesznek Az elkötelezett autonóm változtatások megmaradnak
Tipikus felhasználás Alapvető üzleti logika Audit és hibanaplózás

Ellentétben egy szokásos beágyazott blokk, amelynek változásai mindig megosztják a mellékelt tranzakció eredményét, egy autonóm blokk önmagában is megállja a helyét. Ennek a különbségnek a megértése segít eldönteni, hogy mikor kell egy blokknak függetlennek lennie, és mikor kell megosztania a fő tranzakció eredményét.

GYIK

Oracle Az ORA-06519 hibaüzenetet küldi, és visszagörgeti az autonóm munkát. Minden autonóm tranzakciónak explicit COMMIT vagy ROLLBACK utasítással kell befejeződnie, mielőtt a vezérlés visszatérne a fő tranzakcióhoz, mivel egyszerre csak egy aktív tranzakció engedélyezett.

Nem közvetlenül. Egy normál trigger nem adhat ki COMMIT vagy ROLLBACK utasítást. A trigger, vagy az általa meghívott eljárás PRAGMA AUTONOMOUS_TRANSACTION paranccsal történő deklarálása lehetővé teszi, hogy a triggert kiváltó utasítástól függetlenül véglegesítse saját módosításait.

Nem. A szülő felfüggesztése után az autonóm tranzakció függetlenül fut, és nem láthatja a szülő nem véglegesített módosításait. Csak az adatbázisban már véglegesített adatokat látja, így a szülő zárolására való várakozás holtpontot okozhat.

Igen. Minden DDL utasítás, például a CREATE, ALTER vagy DROP, implicit COMMIT utasítást ad ki a futása előtt és után. A munkamenetben függőben lévő DML automatikusan véglegesítésre kerül, így a DDL utasítás utólag nem vonható vissza.

Egy autonóm blokk meghívhat egy másikat, és mindegyik a saját COMMIT vagy ROLLBACK műveletét kezeli. Oracle A TRANSACTIONS inicializálási paraméteren keresztül korlátozza az egyszerre aktív tranzakciók számát, így az autonóm blokkok nagyon mély beágyazása sikertelen lehet.

Nem. A COMMIT véglegesíti a változtatásokat, feloldja a zárolásokat és törli a mentési pontokat, így a ROLLBACK paranccsal nem vonható vissza. A véglegesített adatok visszavonásához új DML-t kell futtatni. A véglegesítés előtt részleges visszavonáshoz használd a SAVEPOINT és a ROLLBACK TO paranccsal.

Igen. GitHub másodpilóta egy megjegyzésből COMMIT és ROLLBACK logikát, SAVEPOINT blokkokat és PRAGMA AUTONOMOUS_TRANSACTION eljárásokat készít. RevTekintse meg a commit elhelyezését és a hibakezelést, mivel egy rosszul elhelyezett commit sértheti a tranzakcióhatárokat.

A mesterséges intelligencia asszisztensek átvizsgálják az eljárásokat hiányzó vagy eltévedt COMMIT és ROLLBACK utasítások után kutatva, véglegesítik a ciklusokon belüli műveleteket és a lezáratlan autonóm blokkokat. Ez a gépi tanuláson alapuló áttekintés jelzi a tranzakciós hibákat, és biztonságosabb határokat javasol, mielőtt a kód elérné az éles környezetet.

Foglald össze ezt a bejegyzést a következőképpen: