Teorie databází: Transakce
22.12. 2005Co je to transakce? Jaké požadavky musí transakce splňovat. Jaké má transakce výhody, proč používat v DB transakční zpracování. Jaké jsou filozofie zpracování transakcí.
Transakce je uspořádaná skupina databázových operací (dotazů, procedur), která se vnímá a provádí jako jediná jednotka a to celá, nebo vůbec ne. Nikdy nesmí nastat případ, kdy se vykoná jen její část.
Podle Oraclu: Transakce je logická jednotka zpracování dat, která se skládá z jednoho nebo více SQL příkazů provedených jedním uživatelem.
Tyto tvrzení jsou pravdivá, ale co si pod tím představit. Jedním z nejklasičtějších příkladů je převod peněz z jednoho účtu na druhý. Vždy se musí peníze z jednoho účtu odečíst a na druhý přičíst, nikdy nesmí dojít k tomu, že peníze jsou odečteny a nejsou přičteny. Dalším klasickým příkladem je objednání zboží z e-shopu. Tam se musí udělat kontrola, jestli jsou zadány všechny potřebné údaje (dodací adresa, kontaktní e-mail apod.), zkontrolovat zda je zboží skutečně ve skladu, odepsat zboží ze skladu, odečíst peníze z kreditní karty, přidat záznam do objednávek k vyřízení. A toto všechno musí být provedeno vše, nebo nic.
Z příkladů a definice vyplívají požadavky na transakce, které jsou vyjádřeny akronymem ACID:
- Atomicity ? Nerozložitelnost, transakce musí proběhnout buď celá, nebo vůbec a to i v případě totálního pádu serveru.
- Consistency ? Celá transakce se musí navenek jevit jako jediná operace, nikdy nesmí situace, kdy změněná data jednou transakcí byla v jejím průběhu dostupná jiné transakci.
- Isolation ? Izolace, všechny změny provedené před potvrzením transakce musí být izolovány od zbytku systému. Toto ovšem není zrovna jednoduché zařídit, protože v jednu chvíli může na stejných datech pracovat více transakcí, tudíž by je bylo nutno řadit do fronty, což není zrovna efektivní, tudíž se používají různé druhy zamykání přístupu k datům a stupně izolace, které mohou slevovat z této zásady ve prospěch rychlosti paralelního zpracování.
- Durability ? Stálost, po potvrzení transakce musí být databáze opět v konzistentním stavu a to natrvalo, aby se při selhání dala nějakým způsobem obnovit.
Jak rámcově vypadá implementace transakcí. Požadavky na transakce se realizuje dvěma způsoby a to buď pomocí transakčního protokolu, nebo tzv. multigeneračně.
Transakční protokol je soubor dat, ve kterém má server uloženy transakce a jejich průběh a s jehož pomocí lze vrátit vše do konzistentního stavu po pádu OS nebo selhání HW. K zajištění izolovanosti dat se používá zámků, neboli zamykání dat na úrovni databáze/tabulky/řádku. Což znamená, že se jiným transakcím, znemožní práce s daty, které používá právě probíhající transakce, což samozřejmě vede k řazení transakcí do fronty a zpomalení paralelního zpracování, což se řeší různými způsoby zamykání a stupni izolovanosti. Celá filozofie lze ještě rozdělit podle způsobu zamykání na optimistický a pesimistický.
U optimistické filozofie se předpokládá, že ve většině případů nebude docházet ke konfliktům při přístupu ke konkurenčním datům a data jsou zamykána jen a pouze na nezbytně nutnou dobu změny a nepoužívají se zámky na čtení. To ovšem může vést k tzv. deadlockům, což je situace, kdy jedna transakce zamkne data, která potřebuje druhá transakce a ta zamkla data, která právě potřebuje první transakce.
Pesimistická filozofie zamyká data, ke kterým přistoupila jedna transakce i ke čtení, respektive to záleží na stupni izolace dat, který systém implementuje.
Multigenerační, přístup zapisuje do databáze společně s daty číslo transakce, která je vytvořila/změnila. Při potvrzení aktualizační transakce DBMS zkontroluje, jestli neexistují transakce s nižším transakčním číslem, které jsou aktivní. Pokud ano, tak vytvoří novou verzi aktualizovaného záznamu.
Více informací a zámcích a MG na www.ibphoenix.cz v článku pana Filip Kinského o porovnání zamykání a multigeneračního přístupu.

