Autonominen kauppa sisään Oracle PL/SQL: Sitoutuminen, palautus
Mitä ovat TCL-lausekkeet PL/SQL:ssä?
TCL on lyhenne sanoista Transaction Control Statements. Se joko tallentaa odottavat tapahtumat tai peruuttaa odottavan tapahtuman. Näillä lauseilla on tärkeä rooli, koska ellei tapahtumaa tallenneta, muutokset DML-lauseiden kautta eivät tallennu tietokantaan. Alla on erilaisia TCL-lauseita.
COMMIT | Tallentaa kaikki odottavat tapahtumat |
palautus | Hylkää kaikki odottavat tapahtumat |
SAVEPOINT | Luo tapahtumaan pisteen, johon asti palautus voidaan tehdä myöhemmin |
PALAUTUS TOSI | Hylkää kaikki odottavat tapahtumat määritettyyn asti |
Kauppa toteutuu seuraavissa skenaarioissa.
- Kun jokin yllä olevista lausunnoista on annettu (paitsi SAVEPOINT)
- Kun DDL-lausunnot annetaan. (DDL ovat automaattisia sitoumuksia)
- KUN DCL-lausunnot annetaan. (DCL ovat automaattisen vahvistuksen lausuntoja)
Mikä on autonominen transaktio
PL/SQL:ssä kaikkia dataan tehtyjä muutoksia kutsutaan tapahtumaksi. Tapahtuma katsotaan suoritetuksi, kun siihen sovelletaan tallentamista/hylkäämistä. Jos tallennusta/hylkäämistä ei anneta, tapahtumaa ei pidetä valmiina eikä tiedoissa tehtyjä muutoksia tehdä pysyvästi palvelimella.
Huolimatta joistakin istunnon aikana tehdyistä muutoksista, PL / SQL käsittelee koko muutosta yhtenä tapahtumana ja tämän tapahtuman tallentaminen/hylkääminen vaikuttaa koko istunnon odottaviin muutoksiin. Autonomous Transaction tarjoaa kehittäjälle toiminnon, jossa se mahdollistaa muutosten tekemisen erillisessä tapahtumassa ja kyseisen tapahtuman tallentamisen/hylkäämisen vaikuttamatta pääistunnon tapahtumaan.
- Tämä itsenäinen tapahtuma voidaan määrittää aliohjelmatasolla.
- Jotta mikä tahansa aliohjelma toimisi eri tapahtumassa, avainsana 'PRAGMA AUTONOMOUS_TRANSATION' tulee antaa kyseisen lohkon deklaratiivisessa osassa.
- Se käskee kääntäjää käsittelemään tätä erillisenä tapahtumana ja tallentaminen/hylkääminen tämän lohkon sisällä ei heijastu päätapahtumaan.
- COMMIT tai ROLLBACK on pakollinen ennen siirtymistä tästä itsenäisestä tapahtumasta päätapahtumaan, koska kerrallaan vain yksi tapahtuma voi olla aktiivinen.
- Joten kun olemme tehneet itsenäisen tapahtuman, meidän on tallennettava se ja suoritettava tapahtuma, niin voimme vain siirtyä takaisin päätapahtumaan.
Syntaksi:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- Yllä olevassa syntaksissa lohko on tehty itsenäisenä tapahtumana.
Esimerkki 1: Tässä esimerkissä ymmärrämme, kuinka autonominen tapahtuma toimii.
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
Koodin selitys:
- Koodirivi 2: Ilmoitetaan l_salary numeroksi NUMBER.
- Koodirivi 3: Nested_block-proseduurin ilmoittaminen
- Koodirivi 4: Nested_block-proseduurin tekeminen muodossa "AUTONOMOMOUS_TRANSACTION".
- Koodirivit 7-9: Työntekijän 1002 palkan korotus 15000:lla.
- Koodirivi 10: Kaupan sitominen.
- Koodirivit 13-16: Työntekijän 1001 ja 1002 palkkatietojen tulostaminen ennen muutoksia.
- Koodirivit 17-19: Työntekijän 1001 palkan korotus 5000:lla.
- Koodirivi 20: Nested_block-proseduurin kutsuminen;
- Koodirivi 21: Päätapahtuman hylkääminen.
- Koodirivit 22-25: Työntekijän 1001 ja 1002 palkkatietojen tulostaminen muutosten jälkeen.
- Työntekijänumeron 1001 palkankorotus ei näy, koska päätapahtuma on hylätty. Työntekijän numeron 1002 palkankorotus näkyy, koska se lohko on tehty erillisenä tapahtumana ja tallennettu lopussa.
- Riippumatta päätapahtuman tallentamisesta/hylkäämisestä, autonomisen tapahtuman muutokset on tallennettu vaikuttamatta päätapahtuman muutoksiin.