🔐 Indexy a transakce (ACID)

Rejstřík a převod peněz

O čem to je

Ve tlusté učebnici hledáš slovo „fotosyntéza“. Můžeš listovat stránku po stránce, nebo otevřít rejstřík vzadu: slova jsou seřazená abecedně a u každého je číslo stránky. Za pár vteřin jsi tam. Databáze má na totéž index.

Druhá věc: posíláš kamarádovi 500 Kč. Banka je musí odečíst z tvého účtu a připsat na jeho. Kdyby po odečtení vypadl proud, peníze by zmizely. Databáze proto obě změny spojí do transakce: buď proběhnou obě, nebo žádná.

Nové pojmy

IndexPomocná seřazená struktura nad jedním nebo více sloupci tabulky. Pro každou hodnotu ví, kde leží odpovídající řádky. Nejčastěji je to B-strom.Index nad sloupcem prijmeni urychlí hledání podle příjmení.
Procházení celé tabulky (full table scan)Když index chybí, SŘBD musí přečíst každý řádek a u každého zkontrolovat podmínku.Hledání jednoho žáka mezi milionem řádků.
TransakceSkupina příkazů, která se provede jako jeden celek: buď celá, nebo vůbec.Odečtení z jednoho účtu a připsání na druhý.
COMMIT a ROLLBACKCOMMIT transakci potvrdí a změny se trvale uloží. ROLLBACK ji zruší a vrátí data do stavu před jejím začátkem.Při chybě uprostřed převodu se zavolá ROLLBACK.

Index

  • CREATE INDEX idx_zaci_prijmeni ON zaci (prijmeni);

Porovnej pruhy. Bez indexu se čte každý řádek. Seřazený index se prohledává podobně jako binární vyhledávání, takže stačí řádově desítky kroků.

Index pomáháIndex škodí
WHERE s podmínkou na indexovaný sloupeczpomalí INSERT, UPDATE, DELETE (index se musí aktualizovat)
JOIN přes cizí klíčzabírá místo na disku
ORDER BY podle indexovaného sloupceu malých tabulek nemá smysl

Primární klíč a UNIQUE sloupce mají index automaticky. Indexy se proto přidávají hlavně na cizí klíče a sloupce, podle kterých se často hledá.

Transakce

  • START TRANSACTION;
  • UPDATE ucty SET zustatek = zustatek - 500 WHERE id = 1;
  • UPDATE ucty SET zustatek = zustatek + 500 WHERE id = 2;
  • COMMIT;

Kdyby druhý UPDATE selhal, aplikace zavolá ROLLBACK a i první změna se vrátí. Když databáze spadne před COMMIT, při novém startu nedokončenou transakci zruší. (Začátek se v některých SŘBD píše BEGIN.)

Má smysl dát index na sloupec pohlavi s hodnotami M a Ž v tabulce milionu osob?
Většinou ne. Podmínka pohlavi = 'Ž' vybere zhruba polovinu tabulky a SŘBD ji stejně rychleji přečte celou. Index pomáhá u sloupců s mnoha různými hodnotami, kde podmínka vybere malou část řádků.
Uprostřed převodu peněz dojde k chybě. Co se stane, když aplikace zavolá ROLLBACK?
Všechny změny od START TRANSACTION se zruší. První účet bude mít zase původní zůstatek. Peníze nezmizí ani se nezdvojí.
✗Dám index na každý sloupec, databáze bude rychlejší.
✓Index přidávej jen na sloupce, podle kterých se často hledá, řadí nebo spojuje.

Každý index se musí aktualizovat při každém zápisu a zabírá místo. Příliš mnoho indexů zpomalí vkládání a změny.

Index je seřazená pomocná struktura (B-strom), která zrychlí hledání, ale zpomalí zápisy. Transakce spojí příkazy do celku: COMMIT ji potvrdí, ROLLBACK zruší.

ACID

O čem to je

Banka, e-shop i rezervační systém letenek zpracují tisíce operací za sekundu. Dva lidé si chtějí koupit poslední místo v letadle ve stejnou chvíli. Server spadne uprostřed objednávky. Přesto data musí zůstat v pořádku.

Relační databáze to zaručují čtyřmi vlastnostmi transakcí. Podle anglických počátečních písmen se jim říká ACID. Je to častá maturitní otázka.

Nové pojmy

TransakcePosloupnost databázových operací, která tvoří logický celek. Začíná START TRANSACTION (nebo BEGIN), končí COMMIT (potvrzení) nebo ROLLBACK (zrušení).Rezervace místa + zaplacení + vystavení letenky.
Konzistentní stavStav databáze, ve kterém platí všechna pravidla (omezení, cizí klíče, pravidla aplikace).Součet peněz na všech účtech banky se převodem nezmění.
Souběžné transakceTransakce, které běží ve stejnou dobu a pracují se stejnými daty.Dva prodavači prodávají poslední kus zboží.
Transakční log (žurnál)Soubor, kam SŘBD zapisuje změny dřív, než je provede v tabulkách. Podle něj po havárii dokončí potvrzené transakce a vrátí nepotvrzené.Po výpadku proudu se databáze obnoví z logu.
ZámekZnačka, kterou si transakce „zamluví“ řádek nebo tabulku, aby je jiná transakce mezitím nezměnila.První prodavač zamkne řádek se zbožím, druhý musí počkat.

Čtyři vlastnosti ACID

PísmenoVlastnostCo znamenáPřevod peněz
Aatomicita (Atomicity)provede se všechno, nebo nicnikdy jen odečtení bez připsání
Ckonzistence (Consistency)transakce převede databázi z konzistentního stavu do konzistentníhozůstatek nepůjde pod povolený limit
Iizolovanost (Isolation)souběžné transakce se navzájem neovlivňují, jako by běžely po sobědva převody z jednoho účtu se nepřepíší
Dtrvalost (Durability)potvrzená transakce přežije i haváriipo COMMIT a výpadku proudu je převod uložený

Otoč kartičky až poté, co si vlastnost zkusíš říct sám.

  • A – atomicita: všechno, nebo nic
  • C – konzistence: z platného stavu do platného
  • I – izolovanost: souběžné transakce se neruší
  • D – trvalost: potvrzené přežije havárii

Co se stane bez izolace

Na účtu je 1 000 Kč. Transakce T1 přečte zůstatek 1 000.
Současně transakce T2 přečte také 1 000.
T1 vybere 300 a zapíše 700.
T2 vybere 200 a zapíše 800. Přepíše tím zápis T1.
Zůstatek je 800, správně měl být 500. Tomuto problému se říká ztracená aktualizace. Izolace (zámky) ho zabrání.
Kterou vlastnost ACID porušuje systém, kde po potvrzení objednávky a výpadku proudu objednávka zmizí?
Trvalost (D). Co bylo potvrzeno pomocí COMMIT, musí přežít havárii. SŘBD to zajišťuje transakčním logem.
Dvě transakce čekají na zámek, který drží ta druhá. Co se stane?
Vznikne uváznutí (deadlock): žádná nemůže pokračovat. SŘBD ho rozpozná, jednu transakci zruší (ROLLBACK) a druhá doběhne. Aplikace zrušenou transakci obvykle zopakuje.
✗Atomicita znamená, že transakce obsahuje jen jeden příkaz.
✓Atomicita znamená, že všechny příkazy transakce se provedou jako jeden nedělitelný celek: všechny, nebo žádný.

„Atomický“ tu znamená nedělitelný, ne „malý“. Transakce může mít libovolně mnoho příkazů.

ACID: atomicita (vše, nebo nic), konzistence (z platného stavu do platného), izolovanost (souběžné transakce se neruší), trvalost (potvrzené přežije havárii). SŘBD je zajišťuje logem a zámky.