Az egyidejűség leírása

Befejeződött

A többfelhasználós adatbázisok alapvető funkciója az egyidejűség. Az egyidejűség zárolást és blokkolást alkalmaz, hogy az adatok sok felhasználó egyidejű adatfrissítése és adatolvasása mellett is konzisztensek maradjanak. Például a szállítási költségek miatt minden termékünk 5 usd áremelkedéssel rendelkezik. Ugyanakkor a valutaárfolyamok miatt minden termék 3% árcsökkenéssel rendelkezik. Ha ezek a frissítések pontosan ugyanabban az időben történnek, a végső ár változó lesz, és valószínűleg sok hiba történik. A zárolással gondoskodhat arról, hogy az egyik frissítés befejeződjön, mielőtt a másik elkezdődik.

Az egyidejűség a tranzakció szintjén történik. Egy írási tranzakció megakadályozhatja, hogy más tranzakciók frissítsenek, vagy akár ugyanazokat az adatokat olvassák. Az olvasási tranzakciók ugyanúgy blokkolhatják a többi olvasót vagy akár néhány írót is. Ezért fontos elkerülni a szükségtelenül hosszú tranzakciókat vagy túl sok adatra kiterjedő tranzakciókat.

Számos konkrét tranzakcióelkülönítési szint használható annak meghatározására, hogy egy adatbázisrendszer hogyan kezeli a több felhasználót. Ebben a modulban az elkülönítési szint, az optimista zárolás és a pesszimista zárolás széles kategóriáit tekintjük át.

Megjegyzés:

Az egyidejűségen túli tranzakciózárolás teljes részletessége jobban kapcsolódik a teljesítményhez, és nem csak a kódtól függ – bár a jó kód jobban teljesít. További részletekért tekintse át az SQL Server tranzakciózárolási és sorverziós útmutatójának részletes ismertetését . A blokkolással kapcsolatos információkért tekintse át az SQL Server teljesítménydokumentációját is.

Optimista konkurenciakezelés

Optimista zárolás esetén feltételezik, hogy kevés ütköző frissítés fordul elő. A tranzakció kezdetén a rendszer rögzíti az adatok kezdeti állapotát. A tranzakció véglegesítése előtt a rendszer összehasonlítja az aktuális állapotot a kezdeti állapottal. Ha az állapotok megegyeznek, a tranzakció befejeződik. Ha az állapotok eltérőek, a rendszer visszaállítja a tranzakciót.

Van például egy tábla, amely az elmúlt évek értékesítési rendeléseit tartalmazza. Ezek az adatok ritkán frissülnek, de a jelentések gyakran futnak. Optimista zárolással a tranzakciók nem blokkolják egymást, és a rendszer hatékonyabban fut. Sajnos az elmúlt években hibák történtek az adatokban, és frissítéseket kell elvégezni. Bár egy tranzakció minden sort frissít, egy másik tranzakció kisebb módosításokat végez egyetlen sorban egyszerre. Mivel az adatok állapota a kezdeti tranzakció futtatása közben módosult, a teljes tranzakció vissza lesz állítva.

Pesszimista egyidejűség

A pesszimista zárolás feltételezi, hogy egyszerre sok frissítés történik az adatokkal. A zárolások használatával egyszerre csak egy frissítés történhet, és a frissítések során az adatok olvasása le lesz tiltva. Ez megakadályozhatja a nagy visszaállításokat, ahogyan az előző példában látható, de a lekérdezések szükségtelen letiltását okozhatja.

Fontos figyelembe venni az adatok természetét és az adatokon futó lekérdezéseket, amikor eldönti, hogy optimista vagy pesszimista egyidejűséget használ-e az optimális teljesítmény biztosítása érdekében.

Pillanatkép-szigetelés

Az SQL Serverben öt különböző elkülönítési szint létezik, de ebben a modulban csak READ_COMMITTED_SNAPSHOT_OFF és READ_COMMITTED_SNAPSHOT_ON foglalkozunk. READ_COMMITTED_SNAPSHOT_OFF az SQL Server alapértelmezett elkülönítési szintje. Az Azure SQL Database alapértelmezett elkülönítési szintje a READ_COMMITTED_SNAPSHOT_ON.

READ_COMMITTED_SNAPSHOT_OFF zárolja az érintett sorokat a tranzakció végéig, ha a lekérdezés a leolvasott tranzakció elkülönítési szintjét használja. Bár lehetséges, hogy bizonyos frissítések történnek, például egy új sor létrehozása, ez megakadályozza a legtöbb, az adatok olvasását vagy frissítését érintő ütköző módosítást. Ez pesszimista egyidejűség.

READ_COMMITTED_SNAPSHOT_ON pillanatképet készít az adatokról. Ezután a rendszer frissítéseket végez ezen a pillanatképen, így más kapcsolatok lekérdezik az eredeti adatokat. A tranzakció végén az adatok aktuális állapota a pillanatképhez lesz hasonlítva. Ha az adatok megegyeznek, a tranzakció véglegesítése történik. Ha az adatok eltérnek, a tranzakció vissza lesz állítva.

Az elkülönítési szint READ_COMMITTED_SNAPSHOT_ON módosításához a következő parancsot kell kiadni:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;

Az elkülönítési szint READ_COMMITTED_SNAPSHOT_OFF módosításához a következő parancsot kell kiadni:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;

Ha az adatbázist úgy módosították, hogy bekapcsolja az olvasott tranzakció pillanatképét, akkor minden olyan tranzakció, amely az alapértelmezett elkötelezett olvasási izolációs szintet használja, optimista zárolást fog alkalmazni.

Megjegyzés:

A pillanatképek elkülönítése csak az olvasási lekötött tranzakciók esetében történik. Az egyéb elkülönítési szinteket használó tranzakciókra nincs hatással.