16 KiB
Transakce
Transakční zpracování
Ochrana integrity dat
- stav databáze
- dán hodnotami objektů databáze v daném okamžiku
- objektem se rozumí
- tabulka, záznam, položka a spojení
Konzistentní stav databáze
- podmínky definující konzistentní stav databáze jsou definovány integritními omezeními
- jednoduché deklarativní formou
- složitější procedurální formou
Porušení integrity DB
- porušení integrity DB = porušení konzistentního stavu DB
- příčiny
- selhání technického/hw zařízení (disk)
- selhání operačního systému
- chyba v aplikačním programu
- chybný zásah obsluhy
- chybná data
- příčin porušení integrity je tolik, že je těžké jim zabránit
- SŘBD je tedy vybaven
- mechanismem detekce nekonzistentního stavu
- mechanismem zotavení
- SŘBD je tedy vybaven
Ochrana integrity
- prostředky poskytnuté OS
- kopie souboru (zpravidla na různá média)
- kontrolní bod (záloha všech souborů a případné obnovení)
- speciálně vyvinuté pro databázové systémy
- transakce
Transakce
- posloupnost operací nad objekty databáze
- z pohledu uživatele ucelená operace
- je
- logickou jednotkou práce
- jednotkou zotavení z chyb
- po dobu provádění transakce není databáze v konzistentním stavu
- příklad: změna čísla čtenáře
- u čtenáře ale i všech jeho výpůjček
Stavy transakce
- aktivní (A)
- stav od začátku provádění
- chybný (F)
- v pokračování transakce nelze pokračovat
- částečně potvrzený (PC)
- po provedení poslední elementární operace
- transakce nebyla dosud potvrzena
- zrušený (AB)
- po příkazu
ROLLBACK
, vrácení do původního stavu
- po příkazu
- potvrzený (C)
- úspěšné doknčení a potvrzení příkazem
COMMIT
- úspěšné doknčení a potvrzení příkazem
Vlastnosti transakce
- atomicita (Atomicity)
- buď všechny operace nebo žádná
- konzistence (Consistency)
- DB v konzistentním stavu před i po transakci
- izolovanost (Isolation)
- paralelně probíhající transakce se nijak neovlivňují
- trvalost (Durability)
- po úspěšném potvrzení transakce všechny změny v databázi nemohou být ztraceny (ani při havárii systému)
Žurnál
- základní nástroj pro ochranu transakcí
- znám též jako logovací protokol
- zapisují se do něj změny od posledního kontrolního bodu
- obecně obsahuje
- identifikaci transakce
- kdo změnu provádí
- kdy je změna provedena
- kterého objektu se týká
- novou hodnotu objektu
- někdy i starou/původní hodnotu objektu
Metody používání žurnálu
- dopředné procházení (
REDO
)- po chybě se vychází z kopie uložené v kontrolním bodě
- postupně se provádí změny uložené v žurnálu až do chybového okamžiku
- potřebujeme jen nové hodnoty objektů
- zpětné použití žurnálu (
UNDO
,ROLLBACK
)- po chybě se vychází ze současného (nekonzistentního) stavu DB
- využíváme starých hodnot v žurnálu do začátku chybné transakce
- postupným zpětným odvíjením žurnálu se dojde k začátku chybné transakce
Metody ochrany transakce
- odložený zápis do databáze
- tvorba žurnálu s odloženými realizacemi změn
- v minulosti též dvoufázové potvrzování
- přímý zápis do databáze
- tvorba žurnálu s bezprostřední realizací změn
Odložený zápis do databáze
- transakce nesmí měnit hodnoty objektů v databázi dříve, než je částečně potvrzena
- transakce nemůže být částečně potvrzená, pokud není vytvořen příslušný záznam o změnách v žurnálu
- žurnál nevyžaduje staré hodnoty objektů
- nevýhoda: pomalé
- pokud došlo k chybě
- před uložením do žurnálu
- přechod ze stavu aktivní do částečně porvrzený
- nedošlo ke změnám v databázi (zůstala v konzistentním stavu)
- po částečném potvrzení transakce
- přechod ze stavu částečně potvrzený do stavu potvrzený
- všechny změny jsou uloženy v žurnálu
- na žurnál bude použita metoda
REDO
- před uložením do žurnálu
Strategie obnovení odloženého zápisu do DB
- vytvoříme seznam
REDO
- žurnál procházíme od kontrolního bodu do předu
- narazíme-li na konec transakce, vložíme ji do
REDO
- narazíme-li na konec transakce, vložíme ji do
- transakce v seznamu
REDO
zpracujeme metodouREDO
- nedokončené transakce řešit nemusíme, protože neprovedly žádný zápis do databáze
Přímý zápis do databáze
- změny v DB se provedou okamžitě v době potřeby před potvrzením transakce
- v žurnálu je nutné uchovat staré hodnoty objektů
- v případě chyby se provádí vycouvání transakce použitím metody
UNDO
- v případě chyby se provádí vycouvání transakce použitím metody
- výhoda: rychlé
- při chybě disku, kde mám uložený žurnál, nelze použít
- do žurnálu nutno zapisovat i operace čtení
- novou hodnotu objektu zapsanou dosud nepotvrzenou transakcí může číst jiná transakce
- při vycouvání aktuální transakce proto musí vycouvat i ty transakce, které četly nové hodnoty objektů
- to může vést až k tzv. kaskádovému rušení transakcí
- známý také jako dominový efekt
- nejedná se o nějak častý jev
Strategie obnovení přímého zápisu do DB
- vytvoříme dva seznamy:
REDO
aUNDO
- do seznamu
UNDO
vložíme všechny transakce z kontrolního bodu - seznam
REDO
zůstane prázdný
- do seznamu
- žurnál procházíme od kontrolního bodu do předu
- narazíme-li na začátek transakce, vložíme ji do
UNDO
- narazíme-li na konec transakce, převedeme ji z
UNDO
doREDO
- narazíme-li na začátek transakce, vložíme ji do
- transakce zpracujeme metodou odpovídající názvu seznamu, ve kterém se nachází
Paralelní zpracování transakcí
Moduly SŘBD pro zpracování transakcí
- z pohledu synchronizace nás ze SŘBD zajímají tyto moduly
- modul řízení transakcí (RT)
- transakce se na něj obracejí se žádostí o vykonání operace
- modul řízení obnovy databáze (RD)
- v databázi vykoná (realizuje) čtení/zápis podle požadavků plánovače
- plánovač
- zabezpečuje synchronizaci požadavků více transakcí v RT
- požadavky zařazuje do tzv. plánů (rozvrhů)
Zadání příkladu
- ve všech příkladech budeme označovat
- objekty (na disku) písmeny z konce abecedy
- interní proměnné ze začátku abecedy
- mějme
- počáteční hodnotu
X := 10
- dvě transakce
T1
aT2
mající shodnou činnost
- počáteční hodnotu
T1 | T2 |
---|---|
A := read(X) |
|
A := A + 5 |
|
write(X, A) |
|
B := read(X) |
|
B := A + 5 |
|
write(X, B) |
- je několik možných plánů, kdy někde se může čtení z disku spustit dříve, než se zapíše předchozí výsledek
Uspořádatelnost
- serializovatelnost
- efekt paralelního zpracování transakcí musí být stejný, jako by byly transakce uspořádány v nějakém sériovém plánu
Příklad: původní hodnota X := 10
# T1
A := read(X)
A := A + 5
write(X, A)
# T2
B := read(X)
B := B * 3
write(X, B)
- plán 1 (T1, T2), X = 45
- plán 2 (T2, T1), X = 35
- paralelní běh transakcí může skončit jedním nebo druhým výsledkem
Uzamykací protokoly
Operace LOCK(X)
- uzamknutí objektu X vyvolá transakce, aby ho ochránila před přístupem jiných transakcí
- objekt smí být uzamčen pouze jednou transakcí
- pokud chce objekt uzamknout ještě jiná transakce, je systémem pozastavena
Operace UNLOCK(X)
- odemknutí objektu X
- objekt může odemknout jen ta transakce, která jej uzamkla
- pokud na odemčení tohoto objetu čeká jiná transakce, může být opětovně spuštěna
Dvoufázový (zamykací) protokol
- lze dokázat, že uspořádatelnost plánu je zaručena, jestliže
- objekt může být v každém okamžiku uzamčen pouze pro jednu transakci
- jakmile transakce odemkne alespoň jeden objekt, nesmí už žádný objekt uzamknout
- poznámka
- nesmí uzamknout ani ten samý objekt, co odemkla (prostě nesmí žádný objekt uzamknout)
- porušení dvoufázového protokolu hrozí v případě, že si sami definujete a řídíte transakce
- Two-phase locking (2PL)
- fáze 1: růst (expanding)
- transakce smějí pouze zamykat objekty, nesmí je odemykat
- fáze 2: smršťování (shrinking)
- transakce smějí pouze objekty odemykat, nesmí žádný objekt uzamknout
Zamykání objektů
- databázové objekty lze zamykat ve dvou režimech
- výlučný, též exklusivní režim
- sdílený režim
- výlučný režim
- objekt je uzamčen pro operace čtení i zápis
- nemůže být současně uzamčen jinou transakcí
- objekt je uzamčen pro operace čtení i zápis
- sdílený režim
- objekt je uzamčen jen pro operaci čtení
- daný objekt může být současně uzamčen v režimu čtení další transakcí
- objekt je uzamčen jen pro operaci čtení
Uváznutí (deadlock)
- dodržení dvoufázového protokolu ještě neznamená odstranění všech potíží
- zásadní výhoda DB: transakce umí
ROLLBACK
T1 | T2 |
---|---|
LOCK(X) |
|
LOCK(Y) |
|
LOCK(Y) |
|
LOCK(X) |
Další protokoly
Musíme znát nějakou další informaci o objektech databáze, např. způsob jejich uložení
Stromový uzamykací protokol (Tree protocol)
- používá zámky
- pro hierarchické databáze
- reprezentace tzv. grafového protokolu
- první výlučný zámek transakce T lze použít na jakýkoliv objekt X
- další objekt může být uzamčen transakcí T pouze když byl v T uzamčen jeho předchůdce
- objekty mohou být odemknuty kdykoliv
- objekt, který byl v transakci T uzamknut a odemknut nesmí být už v T následovně znovu uzamknut
- všechny plány jsou uspořádatelné a nemůže dojít k uváznutí
Protokol časových značek
- místo zámků používá tzv. časové značky ČZ
- předává ji systém, tvoří rostoucí posloupnost
- plánovač transakcí vykonává konfliktní transakce (pracují nad stejným objektem X) v pořadí jejich ČZ
- takto navržené plány jsou uspořádatelné
- u každého objektu X jsou zaznamenávány největší značky
- pro čtení R_ČZ(X)
- pro zápis W_ČZ(X)
Transakce v praxi
Zajištění konzistence v SŘBD Oracle
- konzistentní čtení (Multiversion Read consistency)
- na úrovni příkazu (Statement-Level Read Consistency)
- data získaná dotazem jsou vždy potvrzená
- na úrovni transakce (Transaction-Level Read Consistency)
- každý příkaz transakce vidí data nová, která byla transakcí zapsána
- ostatní transakce vidí data, která byla dostupná před začátkem transakce
- na úrovni příkazu (Statement-Level Read Consistency)
- ke správě konzistentního čtení se využívají tzv. návratové segmenty
- uloženy v tzv. návratovém tabulkovém prostoru
Nežádoucí jevy při čtení dat v transakcích
- Špinavé čtení (Dirty read)
- též nepotvrzené čtení (Uncommited read)
- příklad
- transakce T1 aktualizuje vybraný záznam
- transakce T2 následně přečte tuto aktualizovanou hodnotu dříve, než proběhne její potvrzení
- problém nastane, když transakce T1 bude zrušena, tj. zavolá
ROLLBACK
- potom transakce T2 přečetla hodnotu, která neměla existovat
- Neopakovatelné čtení (Non-repeatable read)
- nastane, pokud čteme opakovaně stejnou hodnotu, ale v různých časech obdržíme různé hodnoty
- příklad
- transakce T1 přečte vybraný záznam
- transakce T2 následně daný záznam aktualizuje a bude potvrzena
- opětovné čtení stejného záznamu transakce T1 poskytne jiná data nebo také žádná
- Fantomové čtení (Phantom read)
- nastane, pokud při opakovaném čtení získáme nová data, která nebyla dostupná při prvním čtení
- příklad
- transakce T1 přečte záznamy, které vyhovují dotazu
- transakce T2 generuje nový záznam, která změní výsledek dotazu transakce T1
- opětovné vyhodnocení stejného dotazu transakce T1 poskytuje data navíc
Úrovně izolace transakce dle normy
- Serializovatelná (serializable)
- nejvyšší stupeň izolace
- dovoleno vykonávat pouze uspořádatelné plány
- transakce čeká, dokud záznamy uzamčené pro zápis ostatními transakcemi budou odemčeny
- transakce drží zámky buď pro čtení anebo pro zápis pro rozsah záznamů, které chce buď číst anebo ovlivnit zápisem
- rozsahem záznamů se rozumí výsledek selekce transakce
- pokud jiná transakce vloží/aktualizuje/smaže záznam, který do daného rozsahu zapadá, nebude jí zápis povolen
- transakce uvolňuje všechny zámky po jejím potvrzení nebo odvolání
- Opakovatelné čtení (repeatable read)
- transakce čeká, dokud záznamy uzamčené pro zápis ostatními transakcemi budou odemčeny
- transakce drží
- zámky pro čtení pro záznamy, které chce číst
- zámky pro zápis pro záznamy, které chce vkládat/aktualizovat/mazat
- jiná transakce může vložit/aktualizovat ty záznamy, které spadají do rozsahu záznamů uzamčených pro čtení
- transakce uvolňuje všechny zámky po jejím potvrzení nebo odvolání
- Potvrzené čtení (read commited)
- transakce čeká, dokud záznamy uzamčené pro zápis ostatními transakcemi budou odemčeny
- transakce drží
- zámek pro čtení pro aktuálně čtený záznam
- zámek pro zápis záznamu, který chce aktualizovat/mazat
- transakce uvolňuje
- zámek pro čtení po přečtení aktuálního záznamu
- zámky pro zápis po potvrzení nebo odvolání transakce
- Nepotvrzené čtení (read uncommited)
- nejnižší stupeň izolace
- transakce není izolovaná od ostatních transakcí
- obvykle je tato úroveň použita u transakcí v režimu čtení
- čte i nepotvrzené záznamy jiných transakcí
špinavé čtení | neopakovatelné čtení | fantomové čtení | |
---|---|---|---|
serializovatelná úroúveň | nevyskytuje se | nevyskytuje se | nevyskytuje se |
opakované čtení | nevyskytuje se | nevyskytuje se | VYSKYTUJE SE |
potvrzené čtení | nevyskytuje se | VYSKYTUJE SE | VYSKYTUJE SE |
nepotvrzené čtení | VYSKYTUJE SE | VYSKYTUJE SE | VYSKYTUJE SE |
Izolace transakce v SŘBD Oracle |
- Read Commited Isolation Level
- výchozí úroveň
- transakce vidí data dostupná před začátkem transakce
- dovoluje jevy neopakovatelné a fantomové čtení
- trpí efektem ztráty aktualizace dat (lost update)
- Serializable Isolation Level
- transakce vidí potvrzené změny v čase začátku transakce a změny provedené v transakci
- brání všem nežádoucím jevům čtení, netrpí efektem ztráty aktualizace dat
- Read-Only Isolation Level
- podobné jako předchozí úroveň
- transakce nemají přístup k datům, které modifikují jiné transakce
Ztráta aktualizace
- nastane, pokud souběžné transakce modifikují hodnotu stejného záznamu
- zůstane zapsaná až poslední změna, předchozí se ztratí
- příklad
- transakce T1 modifikuje hodnotu konkrétního záznamu
- transakce T2 také později chce modifikovat hodnotu stejného záznamu, ale je pozastavena
- transakce T1 bude poté potvrzena, následně dojde k modifikaci dat transakce T2
- transakce T2 bude potvrzena
Nastavení úrovně izolace
-
na úrovni transakce
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION ISOLATION LEVEL READONLY;
-
na úrovni aktuálního spojení
ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED; ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE; ALTER SESSION SET ISOLATION_LEVEL READONLY;