av Máté Kondor 7 år siden
355
Mer som dette
Az adatbázis kezelő azon működési módja, amely biztosítja azt, hogy aki olvassa az adatokat az ne láthassa mások befejezetlen tranzakcióit. Az implementációja rendkívül nehezen megvalósítható.
Oracle esetén:
Az ORACLE a tranzakciókezelést és az olvasási konzisztenciát lock-ok és úgynevezett UNDO adatok vezetésével valósítja meg.
Forrás: Előadás
Az adatok tranzakció előtti állapotát még mindig vissza lehet állítani a ROLLBACK utasítással.
A munkamenet amelyben folyamatban van a tranzakció, az a SELECT utasításaiban látja a tranzakció során addig végrehajtott összes változtatást.
A többi munkamenet ekkor még nem látja a folyamatban lévő tranzakció által végzett módosításokat.
A folyamatban lévő tranzakció által módosított sorok le vannak zárva(foglalva). Más tranzakciók nem módosíthatják ezeket a sorokat mindaddig, amíg a folyamatban lévő tranzakció be nem fejeződik.
Forrás: Előadás
Forrás: előadás
Ha egyetlen DML művelet végrehajtása során hibára fut, akkor annak az egy utasításnak az összes változtatása mindenestül visszavonásra kerül. A tranzakció során előzőleg végrehajtott módosítások megmaradnak.
Ha mégis a hiba miatt be kéne fejezni a teljes tranzakciót, akkor azt a felhasználónak magának kell kezdeményeznie. (COMMIT vagy ROLLBACK utasítással)
Forrás: Előadás
Forrás: Előadás
Elosztott adatbázisokon nehéz ezt az atomicitást biztosítani. Egy two phase commit nevű algoritmus valósítja meg.
Tranzakciók időbeli folyamata
Az ACID(savasság) az SQL nyelvezetben azt jelenti, hogy melyek azok a képességek, amelyeket az adatbázistól elvárunk.
Forrás: Előadás
A végrehajtott tranzakciók változtatásait egy tartós adattárolón kell tárolni, hogy a szoftver vagy a hardver meghibásodása, áramszünet, vagy egyéb hiba esetén is megmaradjon.
Forrás:
http://aries.ektf.hu/~dream/e107/e107_files/downloads/naplozas.pdf
A tranzakciók izolációja azt biztosítja, hogy az egy időben zajló tranzakciók olyan állapothoz vezetnek, mint amilyet sorban végrehajtott tranzakciók érnének el. Egy végrehajtás alatt álló tranzakció hatásai nem láthatóak a többi tranzakcióból.
Forrás:
http://aries.ektf.hu/~dream/e107/e107_files/downloads/naplozas.pdf
Repeatable Read
Ismételhető olvashatóság. Minden visszaolvasásra ugyan annyi lesz az adatok értéke. Ez azt jelenti, hogy közben más nem tud változtatni az adatokon. A gyakorlatban ez nem jelenik meg, mert a többfelhasználós rendszert teljesen megbénítja.
Forrás: Előadás
Read Uncomitted
Read Comitted
Ami már jóvá van hagyva, azt másik is láthatják, ami még nincs azt pedig mások még nem láthatják.
Forrás: Előadás
Serializable
Sorbarendezhetőség. Pl: 10 egyidőben futó tranzakció együttesen ad majd egy eredményt, akkor sorbarendezhető egy rendszer, ha képes vagyok kiválasztani ennek a 10 tranzakciónak egy olyan sorrendjét, amelynek a végén pont ugyanolyan eredmény születik ha egymás után(seriálisan) hajtottam volna végre. Elég ha egyetlen egy ilyen sorrend létezik, akkor már sorbarendezhető. A későbbiekben a tranzakciók könnyen visszeelemezhetőek lesznek. Jelentősen lelassítja az adatbáziskezelő rendszert.
Forrás: Előadás
A konzisztencia biztosítja, hogy az adatok a tranzakció előtti érvényes állapotból ismét egy érvényes állapotba kerüljenek. Minden erre vonatkozó szabálynak (hivatkozási integritás, adatbázis triggerek stb.) érvényesülnie kell.
Forrás:
http://aries.ektf.hu/~dream/e107/e107_files/downloads/naplozas.pdf
Atomicitás: Az atomicitás megköveteli, hogy több műveletet atomi (oszthatatlan) műveletként lehessen végrehajtani, azaz vagy az összes művelet sikeresen végrehajtódik, vagy egyik sem.
Forrás:
http://aries.ektf.hu/~dream/e107/e107_files/downloads/naplozas.pdf
A tranzakció DML utasítások egy sorozata, amely az adatmódosításaink egy logikai egysége. Ezeket a változtatásokat (módosításokat) egységként vagy érvényesítjük a végén, vagy mindenestül visszavonjuk. Például: ha egy banki ügyintéző átutalást kezdeményez egy ügyfél részére, akkor az ügyfél részéről egy UPDATE utasítással leveszi a pénzt és egy másik UPDATE utasítással a kívánt bankszámla egyenlegét növeli, ezt nevezzük egy logikai egységnek és ezt szeretném jóváhagyni a későbbiekben, ez a COMMIT utasítással fog történni, így a tranzakció sikeresen létre jön. Amennyiben az ügyfél meggondolja magát és nem szeretné végrehajtani az utalást, akkor a tranzakciót teljes egészében vissza kell vonni.
A fejlesztő(programozó) felelőssége az, hogy pontosan megfelelő egységekbe(tranzakciókba) csoportosítsa a DML műveleteket.
Egyes adatbázis kezelőknél a tranzakciók során elhelyezhetőek olyan pontok, amelyekre opcionálisan vissza lehet térni. Ezeket a potenciális visszatérési pontokat nevezzük SAVEPOINT-oknak.
A pontokra visszatérés módja a ROLLBACK TO SAVEPOINT utasítással történik.
Forrás: Előadás
Ha időközben meggondoltuk magunkat és vissza akarjuk csinálni az éppen folyamatban lévő tranzakciókat ezt a ROLLBACK utasítással tudjuk elérni.
Forrás: Előadás
Ha egy tranzakciót véglegesíteni akarunk, akkor a COMMIT utasítással tudjuk megtenni.
A DML (Data Manipulation Language) a már rendelkezésre álló táblák adatait módosítják. Tehát ezekkel a műveletekkel új sorokat szúrhatunk be a táblába, a táblák meglévő sorait módosítjuk, a táblák meglévő sorait kitörölhetjük. Egyes adatbázis kezelőknél jelen van a MERGE is (SQL Server 2008-tól támogatja, Azure SQL Database). Fontos, hogy nem szerkezetet változtatunk, hanem csak a tartalmat. Például: Polgár Péter lakcíme megváltozik, Budapestről Sopronba költözik és ezt megváltoztatjuk az adatbázisunkban is. Egyes elméleti szakértők a SELECT utasítást is ide sorolják. Forrás: Előadás, https://msdn.microsoft.com/en-us/library/bb510625.aspx
A tábla meglévő sorait tudjuk az utasítással törölni.
Szintaxis:
DELETE FROM table_name
WHERE some_column=some_value;
Egy DELETE segítségével törölhetőek ki olyan sorok, amelyek megtalálhatóak egy másik táblában, vagy akár fordítva, azok amelyek nem találhatóak egy másikban sem.
Forrás: Előadás
Az UPDATE utasítás a tábla soraiban, vagy a nézet alaptáblájába esetleg egy materializált nézet soraiban lévő attribútumok értékeit módosítja. Nagyon fontos, hogy meglévő soroknak az értékeit változtatja meg és nem a tábla szerkezetét.
Szintaxis:
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
Forrás: https://www.w3schools.com/sql/sql_update.asp
Egyszerre tetszőleges számú sor is módosítható.
Előadáson elhangzott példához:
A 206-os számú dolgozót szeretnénk módosítani úgy, hogy a bére és a munkaköre olyan legyen, mint a 205-ös dolgozóé. Ez a műveletet akár több sorra is megadhatnánk, ha több dolgozót jelölnénk ki.
Forrás: Előadás
A korrelált UPDATE egy UPDATE utasítás amibe be van ágyazva egy SELECT függvény és ez az utasítás hivatkozik az őt körülvevő SQL utasításra. A működést úgy kell elképzelni, hogy a külső UPDATE által érintett minden sorra lefut a belső SELECT függvény.
A korrelált jelentése az, hogy kívülről befelé kell gondolkoznunk.
Forrás: előadás
Ha az INSERT utasítást egy allekérdezéssel szeretnénk megcsinálni, akkor kell használni a select utasítást. Ekkor nincs szükség a VALUES klauzulára.
A második példa csak arra mutat rá, hogy az INSERT klauzula oszlopainak száma meg kell, hogy egyezzen az allekérdezés oszlopainak számával.
Az INSERT utasítás sorok beszúrására alkalmas a már meglévő táblába.
[ ] zárójelek csak feltételes elemek, nem biztos, hogy minden esetben használni szeretnénk.
Forrás: https://www.w3schools.com/sql
Láthatjuk, hogy egy új sor került felvételre a táblába, a megadott paramétereknek megfelelően.
Az INSERT utasításnál kétféleképpen adhatjuk meg a NULL értéket.
A NULL kulcsszót használjuk a VALUES klauzulában.
Azokat az oszlopokat kihagyjuk a listából, amelyekbe NULL kell, hogy kerüljön.