∴   Tranzakció kezelés AS/400-on, RPG-ben

             Commit, Rollback és a többiek

2014.05.19. 21:44

Mindenki biztos tudja, mi is a tranzakció. Ők ugorják át a következő pár mondatot.

A tranzakció egymás utáni műveletek olyan logikai egysége, amelyben az egyes objektumokon végzett változtatásokat egyszerre érvényesítjük. Ez azt jelenti, hogy az egy tranzakcióba tartozó műveletek vagy egyszerre jutnak érvényre, vagy bármilyen hiba esetén egyszerre kerülnek visszautasításra.

Szép tankönyvízű megfogalmazás. No, de lássunk egy konkrét gyakorlati példát. Tegyük fel, hogy egy ügyfél valamekkora összegű pénzt kíván átutalni az egyik számláról (A) a másikra (B). Ekkor a programnak az összeget le kell vonnia az A számláról, hozzá kell adnia a B számlához, továbbá a pénzügyi tranzakciót fel kell tüntetni a forgalmi naplóban és még ki tudja, hány másik táblában. A program mondjuk először leveszi az összeget az A számláról, majd mielőtt hozzáírná a B számlához, meghibásodik, vagy áramszünet lesz. Ha a műveletek nem lennének egy tranzakcióban, az ügyfél számára elveszne a pénze. Így azonban a tranzakcióban szereplő minden művelet érvénytelen, az adatbázis eredeti állapotába áll vissza, vagyis az összeg az ügyfél A számláján marad.

Másik gyakorlati példa, amikor egy fájlba töltünk fel adatot, akár több tízezer új rekordot generálva, vagy módosítva. Mi van akkor, ha mondjuk a 4567. rekordnál hiba lép fel? Ha nem használtunk tranzakciót, akkor most bajban vagyunk, hiszen ki tudja megmondani, mennyi meglévő rekordot módosítottunk, és azoknak mi volt az eredeti értéke (azt most ne nézzük, hogy végső esetben egy mentésből visszaállíthatjuk az adatokat - talán). Ha használtunk tranzakciót, akkor szuper, minden visszaáll az eredeti állapotába (a hibá(k)ról pedig tájékoztathatjuk mailben a felhasználót).

Hogy is néz ki ez a gyakorlatban az RPG-ben? Az egyszerűség kedvéért csak egy fájlt (fileneve) használok, ezen mutatom be a tranzakció kezelést. Szükség lesz még egy CL és egy RPG (programneve) programra is. A tényleges adatfeldolgozást nem írom le, csak a lényeget, hogy mi is kell nekünk.

1. Első lépésként a fájlt (fileneve, ebbe szeretnénk adatot írni), szép magyarosan "journalozni" kell. Adjuk ki a következő parancsot:

STRJRNPF FILE(könyvtár/fileneve) JRN(könyvtár/journal_fájl_neve)

2. A CL (vagy CLLE) forrásába írjuk be az alábbiakat:

              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)
                                                       
              STRCMTCTL    LCKLVL(*CHG)                
              RTVJOBA      USER(&USER)                

              CALL       PGM(*LIBL/PROGRAMNEVE)

              ENDCMTCTL

3. Az RPG (programneve) forrásába pedig írjuk be az alábbiakat:

FFilename++IPEASF.....L.....A.Device+.Keywords+++++++++++++++++++++++++

FFILENEVE  UF A E           K DISK    COMMIT          
D  R#HIBA         S              4  0

A program végére pedig írjunk egy feltételt. Ha nem volt hiba a feldolgozás során, akkor véglegesítjük a felírást (Commit), ellenkező esetben visszavonjuk az összeset (RolBk). Értlemszerűen az R#HIBA-t léptetjük, ha az adatellenőrzések során hibát kaptunk (én most 4,0 hossz-ra állítottam, remélve hogy 9999-nél nem lenne több hiba. Persze vizsgálat közben lehet (és kell is) vizsgálni, hogy nem értük-e már el a max értékét):

              If (R#HIBA > 0);   
                  RolBk;         

                                    //...ide jöhetnek további utasítások, pl. mail küldés        

                 Else;    
                  Commit;
              Endif;  

Én azért szoktam használni a hibaszámlálót (R#HIBA), mert nem olvasom végig a feldolgozandó fájlt kétszer, hanem csak egyszer, de ha a feldolgozás során bármilyen hibába ütközöm (rossz adat, érvénytelen karakter, stb.), akkor a hibát okozó adatot felírom egy printer fájlba és elküldöm a felhasználónak, hogy javítsa ki. Így ha nincs hiba, akkor elég csak egyszer végig olvasni a feldolgozandó fájlt, míg ha van benne, akkor meg azért jó végigolvasni, mert akkor egyszerre az összes javítandó adatot vissza lehet küldeni a felhasználónak.

 

Végül még egy parancs. Journalt az alábbiakban írtak szerint tudjuk levenni a fájlról:

ENDJRNPF FILE(könyvtár/fileneve) JRN(könyvtár/journal_fájl_neve)

 

A bejegyzés trackback címe:

https://as400programozas.blog.hu/api/trackback/id/tr496183570

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

zummazumm 2014.08.06. 16:24:54

Ezt használni fogom! Úgy látszik sűrűbben kell erre járnom! ;)
süti beállítások módosítása