Know-how, előadás, tranzakciók
Abstract: Ebben a fejezetben részletesen elemezzük a lényege az „ügylet” fogalmak, megtanulják, hogyan kell dolgozni InterBase nyújt tranzakciós megismerkedett több változata építészet, megvizsgáljuk a szintek tranzakció izolációs. Gyakorlati példában olyan alkalmazást hozunk létre, amely egyszerre két tranzakcióval dolgozik.
A tanfolyam során gyakran találkoztunk ezzel a kifejezéssel. A "tranzakciók" témája az InterBase-ban nem egyszerű, de nagyon szükséges a megértéshez. Ez az előadás az ügyletek elméletére vonatkozik. és alkalmazásaik alkalmazásának gyakorlata.
In. „Bevezetés a kliens-szerver adatbázisa InterBase” már említettük, hogy az ügylet - ez a lekérdezés csomagot, amely következetesen változásokat okoz az adatbázisban, és akár fogadható el, ha az összes változtatást megerősítik bejegyzéseket, vagy elutasítják, ha legalább egy sikertelen. Lekérdezések tartalmazhat szereplők SELECT / INSERT / UPDATE / DELETE. és egy tranzakció keretében egy ilyen kérelem létezik. és sok kérés. Azonban a „tranzakció” sokkal mélyebb, mint ez a rövid meghatározás.
A tranzakciók a szerver oldalon futnak, és csak az ügyfélalkalmazás sorrendjében indulnak. Kerekítés a munkát ők is a megrendelések a kliens alkalmazás, és a sikeres befejezése után a tranzakció megerősíti, és ha ez nem sikerül - elutasítja. A triggerek vagy eljárások esetén a tranzakció nem indítható el.
Tranzakciót. Valójában ez egy olyan mechanizmust, amely lehetővé teszi, hogy több akció az adatbázisban, mint egyetlen logikai egységet, amely úgy az adatbázist egy egységes állapotból a másikba. Vagy nem fordítja le, ha a tranzakciót elutasították.
Hadd magyarázzuk meg ezt a pontot a bank egyik bankszámlájáról a másikra történő átutalásának klasszikus példáján.
Tegyük fel, hogy adatbázisunk tranzakció nélkül fut. és meg kell adnunk az említett fordítást. Itt két különböző módon tudunk fellépni:
- Először pénzt vonunk le egy fiókból, majd hozzáadjuk őket egy másik fiókhoz.
- Először pénzt adunk egy másik fiókhoz, majd eltávolítjuk őket az első fiókból.
Tegyük fel, hogy a művelet közepén volt valami hiba: az adatbázis-kiszolgáló le volt választva. például. Az első esetben a pénz elveszik - egy fiókkal maradtak, de nem érte el a másikat. A második esetben a pénz "szaporodik" - jelennek meg a második számlán, de ugyanakkor az első helyen is maradnak. És ebben, és egy másik esetben megsérti az adatbázis integritását - az adatok megbízhatatlanok lesznek.
Azonban minden SQL adatbázis-kiszolgáló működik a tranzakciók használatával. Azt is elmondják, hogy az adatbázis minden változása egy vagy több tranzakció keretében fordul elő. Az InterBase sem kivétel. Az InterBase sokkal rugalmasabb eszközökkel rendelkezik a tranzakciók kezeléséhez. mint sok más SQL-kiszolgáló. Ha volt egy hiba, amit ha pénz átutalására a tranzakció nem erősítették meg, és az adatbázis marad ugyanabban az állapotban - integritását és megbízhatóságát az adatbázis nem törött.
Atomicity (Atomicity)
Az atomicitás azt jelenti, hogy az ügylet az adatbázisban működő egység. A tranzakció során az adatbázis számos módosítása lehetséges. A tranzakció azonban az "összes vagy semmi" elvvel működik. Ha egy tranzakciót megerősít (Commit), akkor a kontextusában végrehajtott összes adatmódosítás megerősítést nyer. Ha visszautasítja (vissza, vissza), az összes módosítás elutasításra kerül. Kudarc esetén a rendszer visszanyeri a tranzakciók következményeit. nincs ideje befejezni.
Konzisztencia (konzisztencia)
A konzisztencia értendő, hogy az adatbázis integritása nem sérül, függetlenül attól, hogy a tranzakciót megerősítették-e. vagy elutasították. A tranzakció eredményeképpen az adatbázis egy koherens és következetes állapotból a másikba mozog. Ha a tranzakciót elutasítják, az adatbázis nem változik.
A kiszolgáló oldalon az ellenőrzési kényszerek felelősek a következetességért. referenciális integritási korlátok és triggerek. A programozónak azonban gondosan meg kell terveznie az üzleti logika mechanizmusát.
Isolation (Isolation)
Számos tranzakció végezhető egyszerre az adatbázisban. Két vagy több tranzakció megpróbálja ugyanazt a rekordot megváltoztatni. Az adatok integritásának biztosítása érdekében a tranzakciókat egymástól elkülönítve hajtják végre. Elmondhatja, hogy minden tranzakció az adatok másolatával (verziójával) működik. Számos tranzakció-elkülönítési fok van. arról, hogy mi tovább fogunk részletesebben beszélni.
Stabilitás (tartósság)
Ha a tranzakció sikeresen befejeződött, a kontextusban végrehajtott változtatásoknak stabilnak és fenntarthatónak kell lenniük, függetlenül a más tranzakciók hibáitól. hardverhibák vagy kiszolgáló leállítása. Más szavakkal, a sikeresen teljesített tranzakció eredményeit fizikailag az adatbázis tárolja.
A tranzakciók implicit és explicit indítása
Az adatbázisban végrehajtott összes művelet az ügyfélalkalmazásban a tranzakció keretében történik. A korábbi előadások példáiban ügyfélalkalmazásokat csatlakoztattunk az adatbázisba, anélkül, hogy tranzakciókat használnánk. Ez azonban nem jelenti azt, hogy nem. Egyszerűen a tranzakciók implicit módon, automatikusan. És a Delphi által "alapértelmezés szerint" létrehozott paraméterekkel. Komoly adatbázis-alkalmazásoknál ez elfogadhatatlan, mivel számos konfliktushoz vezethet.
A tranzakciót kifejezetten elindíthatja. A szabványos hozzáférési mechanizmusok közül elsősorban az InterBase Express (IBX) használatát alkalmazzuk. A pályázatnak minimálisnak kell lennie. az IBTransaction egyik összetevője. Ezzel az összetevővel kifejezetten megadhatja a tranzakciós paramétereket. szabályozza a tranzakció indítását, megerősítését vagy visszaállítását. Ez a következő összetevő módszerekkel történik:
- StartTransaction - Indítsa el a tranzakciót.
- Kötelezettség - A tranzakció megerősítése a későbbi zárással.
- CommitRetaining - A tranzakció megerősítése bezárása nélkül.
- Visszafolyás - A tranzakció visszaállítása az azt követő lezárással.
- RollbackRetaining - A tranzakció visszavonása bezárása nélkül.
Az adatbeviteli összetevők azonban implicit módon futtatják a tranzakciót. ezért a StartTransaction általában kihagyásra kerül. De a tranzakció visszaigazolása vagy visszaállítása rendszerint ellenőrzött ... kivéve az ügyfélalkalmazásban lévő blokkot:
Ebben a példában, ha a tranzakció sikeres volt, az adatokat rendszerint tárolják. Hiba esetén üzenet jelenik meg, és a tranzakció visszahúzódik.
A tranzakció működése
Az adatbázisban van egy speciális terület, az úgynevezett TIP (Transaction Inventory oldal - Készlettranzakciók oldal). Amikor a tranzakció megkezdődik. ez egy azonosító van rendelve (TID Transaction ID.) - leltári szám, amely tárolja a TIP. A legfrissebb tranzakció lesz a legnagyobb azonosítója. TIP-ben. az indított tranzakció számán kívül. menti és annak állapotát, amely lehet aktív (a munka), elkötelezett (megerősítve), Hengerelt Back (Törölve rollback), és bizonytalanságban (bizonytalan).
Az aktív tranzakciónak nevezik. amely jelenleg fut.
A tranzakció megerősítve. amely sikeresen befejezte munkáját, általában a Commit paranccsal.
A törölt tranzakció hívásra kerül. amely sikertelenül végződött. Ebben az esetben az általa végrehajtott műveletek visszafordulnak, általában a RollBack paranccsal.
Egy nem definiált tranzakció (Limbo) egy tranzakció. amely két vagy több adatbázissal párhuzamosan működik. Egy ilyen ügylet lezárásakor. Az InterBase elvégzi a Commit kétfázisú visszaigazolását. annak biztosítása, hogy a változások a teljes adatbázisra vonatkoznak. vagy sem. Ebben az esetben egymás után adják meg az adatbázisokban szereplő visszaigazolást. Ha ebben az időben rendszerhiba keletkezik, előfordulhat, hogy valamilyen adatbázis-változás történt, és amelyben nincs. Ebben az esetben a tranzakció meghatározatlan állapotba kerül, amikor a szerver nem tudja, hogy megerősíti-e a tranzakciót. vagy visszahúzás.
Minden tranzakció. megkezdi a munkát, létrehozza a táblák nyilvántartásának saját verzióját, amellyel működik. A rekordverzió egy olyan rekord egy példánya, amely akkor jön létre, amikor a tranzakció megpróbálja módosítani. Így minden táblázatbevitel potenciálisan több verziójú lehet, és minden egyes tranzakció a saját verziójával dolgozik. Ha egy tranzakció adatokat változtat, akkor a változatát a rekord saját verziójában változtatja meg, és nem az eredetiben. Ezután a tranzakció megerősíthető vagy törölhető.
Ha a tranzakciót megerősítette, az InterBase megpróbálja megjelölni az előző eredeti bejegyzést. mint a távoli, és a befejezett tranzakció változata, mint az eredeti. Ha az InterBase megmenti a változásokat, akkor a tranzakcióazonosító is az új bejegyzésbe kerül. amelyek végrehajtották ezeket a változtatásokat (a táblázat bármely sorában megtalálható a létrehozott tranzakció azonosítója).
Ha a tranzakció sikertelen, akkor az eredeti dokumentum eredeti marad.
Ha a tranzakció csak a rekordot olvasja. nem próbálja megváltoztatni, akkor nem hoz létre saját verziót.
Előfordulhat, hogy tranzakciós konfliktusok vannak. Tételezzük fel, hogy a T1 tranzakció megkezdődött. Ő hozta létre a rekord verzióját, és megváltoztatta az adatait. Abban az időben a T2 versenyző tranzakció elindult, és ugyanazon rekord verzióját hozta létre. Mivel T1 még nincs vége, T2 nem lehetett látni az adatokat elején a változtatások, amelyeket a T1, ezért megalkotta saját verzióját a régi eredeti. Most a T1 befejezi a Commit munkáját. Mi az InterBase? Ha a T1 rekord verzióját eredeti, de régi rekordként jelöli meg. mint távoli, akkor a T2 verziója hamis adatok lesznek! Az InterBase műveletek ebben az esetben a tranzakciók paramétereitől függenek. amiről az alábbiakban részletesebben fogunk beszélni.
Ha egy tranzakció töröl egy sort, a sor nem kerül fizikailag eltávolítva az adatbázisból. de csak a távoli, a mentési és a törölt tranzakció számát jelöli meg. Abban az esetben, ha a tranzakció sikertelen, a vonal tényleges törlése nem történt, mert nem történt visszaigazolás.
Így azt mondják, hogy az InterBase többváltozatos architektúrával rendelkezik (MGA - Multi Generation Architecture). Ez az architektúra lehetővé teszi, hogy a munkát az adatbázis segítségével szervezze meg, hogy az olvasó felhasználók ne blokkolják az írókat. Emellett, amikor egy rendszer összeomlik, az InterBase nagyon gyorsan visszaállítható, köszönhetően az MGA-nak. By the way, az InterBase az első olyan SQL-szerver, amely támogatja a többváltozós architektúrát.
E megközelítés előnyeivel együtt idővel "szemetet" gyűjtenek az adatbázisban. Minden tranzakció. megpróbálja megváltoztatni az adatokat, létrehozza a sorok saját verzióját, és ha nem gondoskodik a régi, már felesleges verziók időben történő eltávolításáról, az adatbázis hamarosan csak elakadt.
De hogyan lehet eltávolítani a szemetet? Törölhetem a tranzakció verzióját. amely véget ért, sikeresen vagy sikertelenül? Nem, ha ezt a verziót jelenleg más tranzakciók használják. Később beszélünk a tranzakciók elszigetelési szintjéről. eddig csak azt mondják, hogy egyes tranzakciók láthatják azokat a változásokat, amelyeket mások még nem erősítettek meg aktív tranzakciókkal.
Tételezzük fel, hogy a T1 tranzakció megkezdődött. Ez a tranzakció létrehozta a rekord verzióját, és módosította. Később elkezdődött a T2 tranzakció, amely úgy van beállítva, hogy minden adatmódosítást láthasson, még azokat is, amelyeket nem erősített meg. Ugyanezt a rekordot fordította, és mivel a legfrissebb változásokat szeretné látni, a tranzakció T1 verziójával rendelkezik. Ezután a T1 befejezte a munkáját, de a T2 továbbra is működik a rekord verziójával, ezért ez a verzió nem törölhető.
Az InterBase-nek van mechanizmusa a régi változatok eltávolítására, amelyet új tranzakciók indítanak. Új ügylet. nyilvántartást kér. olvassa el a rekord összes verzióját. Ez ellenőrzi, hogy az ügylet volt-e. a verzió ennek a verziónak a törlését (RollBack) vagy megerősítette (Commit). Ha a tranzakciót törölték, akkor ez a verzió hulladék, amelyet törölni kell. Ha több verzió van megerősített tranzakciókkal. a legnagyobb tranzakciós azonosítóval rendelkező változat relevánsnak tekinthető. A fennmaradó verziók elavultnak minősülnek, és törlésre is kerülnek.
Így a fiatal ügyletek rendezik az adatbázist a régebbi tranzakciókból származó szemetetől. De nem tisztítják az összes régi verziót egymás után, csak azoknak a verzióknak (vagy rekordoknak) a verzióját, amelyeket maguk címeznek.
Mert sok tranzakció egyszerre végrehajtható a kiszolgálón. van egy terminológia ezen tranzakciók meghatározásához.
- Az aktív tranzakció egy tranzakció, amely elkezdődött, de még nem fejeződött be.
- A tranzakció egy olyan ügylet, amely verseng a jelenlegi tranzakcióval.
- A legrégebbi aktív tranzakció ilyen aktív tranzakció. amely mások előtt kezdődött. Vagy ez egy aktív tranzakció a legkisebb azonosítóval.
- A legrégebbi érdekelt tranzakció olyan érdekes tranzakció. amely mások előtt kezdődött. Vagy ez egy érdekes tranzakció a legkisebb azonosítóval.
Ebben az összefüggésben a legrégebbi aktív ügylet hulladékgyűjtéssel foglalkozik. Mivel a verziók verzióját fiatalabb ügyletek teszik. nem látja, majd eltávolítja a még régebbi tranzakciókból származó szemetet. Amikor az ügylet befejezi munkáját, a "legrégebbi aktív" állapota egy másik tranzakcióhoz vezet. Így a tranzakciók átruházzák egymás felelősségét a szemétgyűjtésre.