CodeGym/Java tanfolyam/All lectures for HU purposes/Egyidejű tranzakciók problémái

Egyidejű tranzakciók problémái

Elérhető

1.1 Bevezetés

És most kezdődik a móka – a tranzakciók működésének elmélete. Hogyan tartható fenn a rendszer működése, ha ugyanazokat az adatokat módosítja a különböző szálakban? Vagy egy tranzakciót szeretne végrehajtani egy másikban? Ezekre a kérdésekre keressük a választ a tranzakciók elszigeteltségének tanulmányozásával ...

A tranzakció elkülönítési szintje egy feltételes érték, amely meghatározza, hogy a logikailag párhuzamos tranzakciók DBMS-ben történő végrehajtásának eredményeként milyen mértékben megengedettek az inkonzisztens adatok. A tranzakciós elkülönítési szintek skálája számos értéket tartalmaz, a legalacsonyabbtól a legmagasabbig; a magasabb elkülönítési szint jobb adatkonzisztenciának felel meg, de használata csökkentheti a fizikailag párhuzamos tranzakciók számát.

Ezzel szemben az alacsonyabb elkülönítési szint több párhuzamos tranzakciót tesz lehetővé, de csökkenti az adatok pontosságát. Így az információs rendszer fejlesztője az alkalmazott tranzakciói elszigeteltség szintjét választva bizonyos mértékig választási lehetőséget biztosít a munkavégzés gyorsasága és a rendszerből kapott adatok garantált konzisztenciájának biztosítása között.

Egyidejű hozzáférés problémái tranzakciók használatával

Ha a tranzakciókat párhuzamosan hajtják végre, a következő problémák merülhetnek fel:

  • elveszett frissítés - ha egy adatblokkot egyszerre változtatnak meg különböző tranzakciók, akkor az utolsó kivételével minden változás elveszik;
  • "piszkos" olvasás (eng. Dirty read) - tranzakció által hozzáadott vagy módosított adatok olvasása, amelyek később nem kerülnek megerősítésre (visszagörgetésre);
  • nem ismételhető olvasás (eng. non-repeatable read) - ugyanazon tranzakción belüli újraolvasáskor a korábban olvasott adatok megváltoznak;
  • fantomolvasás - egy tranzakció végrehajtása során többször is kijelöl több sort ugyanazon kritériumok szerint. Egy másik tranzakció ezen lekérések között sorokat ad hozzá vagy oszlopokat módosít az első tranzakció lekérési feltételeiben használt sorok némelyikéhez, és sikeresen befejeződik. Ennek eredményeként kiderül, hogy az első tranzakcióban ugyanazok a kijelölések különböző sorokat adnak.

Fontolja meg azokat a helyzeteket, amelyekben ezek a problémák előfordulhatnak.

1.2 Elveszett frissítés

Az a helyzet, amikor egy adatblokkot egyidejűleg különböző tranzakciók módosítanak, az egyik változás elveszik.

Tegyük fel, hogy két tranzakció fut egyszerre:

1. tranzakció 2. tranzakció
UPDATE tbl1 SET f2=f2+20 WHERE f1=1; UPDATE tbl1 SET f2=f2+25 WHERE f1=1;

Mindkét tranzakciónál az f2 mező értéke megváltozik, a kitöltést követően a mező értékét 45-tel kell növelni. Valójában a következő műveletsor történhet:

  1. Mindkét tranzakció egyszerre olvassa be a mező aktuális állapotát. Itt nem szükséges a pontos fizikai párhuzamosság, elég, ha a sorrendben a második olvasási művelet befejeződik, mielőtt egy másik tranzakció megírná az eredményét.
  2. Mindkét tranzakció úgy számítja ki az új mezőértéket, hogy 20-at, illetve 25-öt ad hozzá az előzőleg beolvasott értékhez.
  3. A tranzakciók megpróbálják visszaírni a számítás eredményét az f2 mezőbe. Mivel fizikailag lehetetlen egyszerre két írást végrehajtani, a valóságban az egyik írási műveletet korábban, a másikat később hajtják végre. A második írási művelet felülírja az első eredményét.

Emiatt az f2 mező értéke mindkét tranzakció teljesítésekor nem 45-tel, hanem 20-zal vagy 25-tel nőhet, vagyis az egyik adatmódosító tranzakció „eltűnik”.

1.3 "Piszkos" olvasás

Olyan tranzakció által hozzáadott vagy módosított adatok beolvasása, amelyek később nem véglegesíthetők (visszagörgetés).

Tegyük fel, hogy két tranzakciót nyitottak meg különböző alkalmazások, amelyek a következő SQL utasításokat hajtják végre:

1. tranzakció 2. tranzakció
UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
SELECT f2 FROM tbl1 WHERE f1=1;
VISSZATÉRÍTÉSI MUNKA;

Az 1. tranzakcióban az f2 mező értéke módosul, majd a 2. tranzakcióban ennek a mezőnek az értéke kerül kiválasztásra. Ezt követően az 1. tranzakció visszagörgetésre kerül, így a második tranzakció által kapott érték eltér az adatbázisban tárolt értéktől.

1.4 Nem megismételhető leolvasás

Az a helyzet, amikor ugyanazon tranzakción belüli újraolvasáskor kiderül, hogy a korábban olvasott adatok megváltoztak.

Tegyük fel, hogy két tranzakciót nyitottak meg különböző alkalmazások, amelyek a következő SQL utasításokat hajtják végre:

1. tranzakció 2. tranzakció
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+3 WHERE f1=1;
ELKÖVETNI;
SELECT f2 FROM tbl1 WHERE f1=1;

A 2. tranzakcióban az f2 mező értéke kerül kiválasztásra, majd az 1. tranzakcióban az f2 mező értéke módosul. Ha újra megpróbál egy értéket kiválasztani a 2. tranzakció f2 mezőjéből, akkor más eredményt kap. Ez a helyzet különösen elfogadhatatlan, ha az adatokat részben módosítani kell, és visszaírni az adatbázisba.

1.5 „Fantomok” olvasása

Az a helyzet, amikor ugyanazon tranzakción belüli ismételt olvasás során ugyanaz a kijelölés különböző sorokat ad.

Tegyük fel, hogy két tranzakciót nyitottak meg különböző alkalmazások, amelyek a következő SQL utasításokat hajtják végre:

1. tranzakció 2. tranzakció
SELECT SUM(f2) FROM tbl1;
INSERT INTO tbl1 (f1,f2) VALUES(15,20);
ELKÖVETNI;
SELECT SUM(f2) FROM tbl1;

A 2. tranzakció végrehajt egy SQL utasítást, amely az f2 mező összes értékét használja. Ezután egy új sor kerül beszúrásra az 1. tranzakcióba, amitől a 2. tranzakció SQL utasításának újrafuttatása eltérő eredményt ad. Ezt a helyzetet fantomolvasásnak (fantomolvasás) hívják. A nem megismételhető leolvasástól abban különbözik, hogy az ismételt adatelérés eredménye nem magának az adatnak a megváltoztatása/törlése, hanem új (fantom) adatok megjelenése miatt változott.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései