Autonominė operacija naudojant „Oracle PL / SQL“: „Commit“, „Rollback“

Turinys:

Anonim

Kas yra TCL teiginiai PL / SQL?

TCL reiškia sandorių valdymo ataskaitas. Tai arba išsaugos laukiančias operacijas, arba grąžins laukiančias operacijas. Šie teiginiai vaidina gyvybiškai svarbų vaidmenį, nes, išskyrus atvejus, kai sandoris bus išsaugotas, pakeitimai per DML ataskaitas nebus išsaugoti duomenų bazėje. Žemiau pateikiami skirtingi TCL teiginiai.

ĮSIPAREIGOTI Išsaugo visą laukiančią operaciją
GRĄŽINIMAS Atmeskite visą laukiančią operaciją
SAVEPOINT Sukuria operacijos tašką, iki kurio gali būti sugrąžinta vėliau
GRĮŽTI Į Atmeskite visą laukiančią operaciją iki nurodyto

Sandoris bus baigtas pagal šiuos scenarijus.

  • Kai pateikiamas kuris nors iš pirmiau nurodytų teiginių (išskyrus SAVEPOINT)
  • Kai išduodami DDL pareiškimai. (DDL yra automatinio įsipareigojimo teiginiai)
  • KAI išleidžiami DCL pareiškimai. (DCL yra automatinio įsipareigojimo teiginiai)

Kas yra autonominis sandoris

PL / SQL visi modifikuoti duomenys bus vadinami operacija. Sandoris laikomas baigtu, kai jam taikomas išsaugojimas / atsisakymas. Jei nebus išsaugota / atmesta, operacija nebus laikoma baigta ir duomenų modifikacijos serveryje nebus nuolatinės.

Nepaisant kai kurių modifikacijų, atliktų sesijos metu, PL / SQL visą modifikaciją traktuos kaip vieną operaciją, o šios operacijos išsaugojimas / atmetimas paveiks visus laukiančius tos sesijos pakeitimus. Autonominė operacija suteikia kūrėjui funkciją, kurioje ji leidžia atlikti pakeitimus atskiroje operacijoje ir išsaugoti / atmesti tą konkrečią operaciją, nepaveikdama pagrindinės sesijos operacijos.

  • Šią savarankišką operaciją galima nurodyti paprogramės lygiu.
  • Norint, kad kuri nors paprogramė veiktų su kita operacija, deklaratyviame to bloko skyriuje turėtų būti pateiktas raktinis žodis „PRAGMA AUTONOMOUS_TRANSATION“.
  • Jis nurodys kompiliatoriui tai laikyti atskiru sandoriu, o taupymas / išmetimas šiame bloke neatsispindės pagrindinėje operacijoje.
  • Išleisti COMMIT arba ROLLBACK yra privaloma prieš pradedant šį savarankišką sandorį su pagrindine operacija, nes bet kuriuo metu gali būti aktyvus tik vienas sandoris.
  • Taigi atlikę savarankišką operaciją turime ją išsaugoti ir užbaigti, tada tik mes galime grįžti prie pagrindinės operacijos.

Sintaksė:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • Pagal aukščiau pateiktą sintaksę blokavimas buvo atliktas kaip savarankiškas sandoris.

1 pavyzdys : Šiame pavyzdyje mes suprasime, kaip veikia savarankiškas sandoris.

DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT 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 empSET salary = salary + 5000WHERE 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;

Rezultatas

Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000

Kodo paaiškinimas:

  • 2 kodo eilutė : l_salary deklaruojama kaip NUMBER.
  • 3 kodo eilutė : „Nested_block“ procedūros deklaravimas
  • 4 kodo eilutė : „nested_block“ procedūros atlikimas kaip „AUTONOMOUS_TRANSACTION“.
  • Kodo 7–9 eilutė: atlyginimo darbuotojui 1002 padidinimas 15 000.
  • 10 kodo eilutė: Sandorio įvykdymas.
  • Kodo eilutė 13-16: Darbuotojų 1001 ir 1002 atlyginimų duomenų spausdinimas prieš pakeitimus.
  • Kodo eilutė 17-19: Darbuotojo 1001 atlyginimo padidinimas 5000.
  • Kodo eilutė 20: iškviečiama „nested_block“ procedūra;
  • Kodo 21 eilutė: pagrindinės operacijos atsisakymas.
  • Kodo eilutė 22-25: Darbuotojų 1001 ir 1002 atlyginimų duomenų spausdinimas pasikeitus.
  • Darbuotojo 1001 atlyginimo padidėjimas neatsispindi, nes pagrindinis sandoris buvo atmestas. Darbuotojo 1002 atlyginimo padidėjimas atsispindi, nes tas blokas buvo padarytas kaip atskiras sandoris ir pabaigoje išsaugotas.
  • Taigi, neatsižvelgiant į pagrindinio sandorio išsaugojimą / išmetimą, autonominio sandorio pakeitimai buvo išsaugoti, nepaveikiant pagrindinių sandorių pokyčių.