Delphi - TIBTransaction komponens

Interbase 5. rész

forráskód letöltése
A sorozat mai cikkében az TIBTransaction komponenssel ismerkedünk meg. Megnézzük, hogy mik is azok a tranzakciók, miért van rájuk szükség. Bemutatjuk a komponens tulajdonságait, eseményeit és metódusait. Beépítve a példaprogramba tanulmányozhatjuk, hogyan teszi biztonságosabbá az adatok kezelését. Tranzakciónak nevezzük az egyetlen logikai egységet képző adatbázis-kezelési műveletet. Vagy a tranzakció összes művelete megtörténik, vagy egyik sem. Egy hiba esetén a teljes tranzakció visszagörgetődik, beáll a tranzakció előtti konzisztens állapot.

Általános javaslat, hogy egy tranzakció a lehető legkevesebb módosítást tartalmazza (csak a szigorúan összetartozókat, amelyek egy egységet alkotnak), hogy gyors legyen. Kerüljük az olyan tranzakciókat, amely felhasználói beavatkozásra vár a befejezéshez, mert ha a felhasználó például otthagyja a gépet a tranzakció nagyon hosszú ideig aktív maradhat. A több rekordot egyszerre frissítő UPDATE utasítások és a tárolt frissítések használata segít abban, hogy a tranzakciók kis méretűek és gyorsak legyenek.

Az IBTransaction komponens segítségével teljes mértékben felügyelhetjük a tranzakciókat. Fontos tudni, hogy legalább egy komponens szükséges minden olyan programban, amelyik az InterBase Express komponenscsomagot használja. Ha egy tranzakció-komponenshez kapcsolt adatkészlet szerkesztését megkezdjük, a tranzakció automatikusan elindul.

Most nézzünk meg egy példakódot arra, hogyan használjuk a komponenst.
Procedure TForm1.Button1Click(Sender : TObject);
Begin
    IBTransaction1.CommitRetaining; //IBTransaction1.RollbackRetaining;
End.
A következő kód is helyes, de mivel lezáródik a kurzor meg kell nyitnunk az adatforrást:
Procedure TForm1.Button1Click(Sender : TObject);
Begin
   IBTransaction1.Commi; //IBTransaction1.Rollback;
   IBTransaction1.StartTransaction;
   DataSourceX.DataSet.Open;
End.
Ne felejtsük el, hogy az InterBase lezár minden kurzort, ha a tranzakció véget ér. Ami azt jelenti, hogy újra meg kell nyitni, és újra ki kell nyerni belőle az adatokat, attól függetlenül, hogy változtattunk-e rajtuk. Ha véglegesítjük, vagy visszagörgetjük az adatokat, a CommitRetaining vagy a RollbackRetaining parancsokkal megkérhetjük az InterBase-t, hogy maradjon a tranzakcióban, nyitva hagyva az adatkészletet. Ennek a viselkedésnek az az oka, hogy a tranzakciók az adatok egy pillanatnyi állapotát jelentik. Ha egy tranzakció befejeződött, az adatokat újra kell olvasni, mert közben más felhasználók is módosíthattak rajtuk.

A komponens gyakrabban használt tulajdonságai:
  • Active: Beállíthatjuk, hogy a tranzakció aktív legyen. A tulajdonság használatával meg is tudhatjuk, hogy aktív-e a tranzakció vagy sem.
  • DatabaseCount: A tranzakció részét képző adatbázisok számát adja.
  • Databases: A beállított index által visszaadott adatbázist mutatja.
  • DefaultAction: Milyen tranzakció következzen be, amikor egy az IdleTimer tulajdonságnál beállított idő eltelik. Négy lehetséges értéke van:
- taRollback: A tranzakció visszagörgetődik.
- taCommit: A tranzakció végrehajtódik.
- taRollbackRetaining: A tranzakció visszagörgetődik, de az adatkészlet nyitva marad.
- taCommitRetaining: A tranzakció végrehajtódik, de az adatkészlet nyitva marad.
  • DefaultDatabase: Mely IBDatabase komponensre hassanak a tranzakciók.
  • IdleTimer: Mennyi idő teljen el addig másodpercekben, amíg a DefaultAction tulajdonságnál beállított tranzakció automatikusan bekövetkezik.
  • InTransaction: A tulajdonság segítségével megállapítható, hogy egy tranzakció folyamatban van-e vagy sem.
  • Params: A tranzakció paramétereit állíthatjuk be. Ritkán használjuk.
A komponens eseményei:
  • OnIdleTimer: Az IdleTimer tulajdonság által meghatározott idő elérésekor aktiválódik. Lehetőséget biztosít például arra, hogy tájékoztassuk a felhasználót, hogy a tranzakció végbement, mert a gép sokáig nem kommunikált az adatbázissal.
A komponens metódusai:
  • AddDatabase: Újabb adatbázis tranzakció-kezelését bízhatjuk a komponensre.
  • CheckDatabasesInList: Ellenőrizhetjük, hogy az adatbázis benne van-e a tranzakció listájában. Ha nincs, egy kivétel keletkezik.
  • CheckInTransaction: Ellenőrizhetjük, hogy a tranzakció aktív-e, és hogy a tranzakció listájában található-e adatbázis. Ha a feltételek nem teljesülnek, akkor egy kivétel keletkezik.
  • CheckNotInTransaction: Azonos funkciójú eljárás, mint az előző, csak az ellenőrzést fordított értelemben végzi el.
  • Commit: Mindenféle frissítés, törlés, módosítás véglegesen belekerül az adatbázisba, és a tranzakció befejeződik. Az eljárás hívása után a következő tranzakció elindításához a StartTransaction metódust kell meghívni. A Commit meghívása előtt ellenőrizzük, hogy van-e tranzakció az InTransction tulajdonság használatával.
  • CommitRetaining: Hasonló funkciójú metódus, mint az előbbi eljárás, de nem zárja le az aktuális tranzakciót. Utána nem kell meghívni a StartTransaction metódust.
  • FindDatabase: Megkeresi a megadott IBDatabase komponenshez tartozó indexet a lista alapján.
  • RemoveDatabase: Egy IBDatabase komponenst töröl a listából.
  • RemoveDatabases: Az IBTransaction komponenshez kapcsolt összes adatbázis-komponenst törli.
  • Rollback: A tranzakciót visszagörgeti, és lezárja azt. Az eljárás hívása után a következő tranzakció elindításához a StartTransaction metódust kell használni. A Rollback meghívása előtt ellenőrizzük, hogy van-e aktív tranzakció az InTransaction tulajdonság használatával.
  • RollbackRetaining: Hasonló funkciójú metódus, mint az előbbi eljárás, de nem zárja le az aktuális tranzakciót. Utána nem kell meghívni a StartTransaction metódust.
  • StartTransaction: Új tranzakciót indíthatunk el.

A mellékelt példa magyarázatai a forráskódban lettek elhelyezve.
Próbáljuk ki a tranzakciók hatását: változtassunk az adatokon, majd véglegesítsük, vagy görgessük vissza a változásokat a Tranzakciók menü valamelyik elemét használva. Figyeljük meg a hatásokat.

Interbase cikksorozat