Transakce - přehled
Klíčová slova: Transakce
Klíčové pojmy: Transakce je logická jednotka provedení operací, Atomičnost: vše nebo nic (ROLLBACK), Izolovaná vratnost zabraňuje cascading rollback, Pernamentnost zajišťuje trvalost po COMMITu, Globální transakce se skládají z lokálních podtransakcí, Dvoufázový protokol (2PC): prepare + commit/abort, Žurnál a checkpointy umožňují UNDO/REDO zotavení, Uzamykání + 2PL zajišťují serializovatelnost, Deadlock se detekuje čekacím grafem (hledání cyklů), Time-stamp metody: Wait-Die a Wound-Wait, SAVEPOINT umožňuje částečný ROLLBACK v SQL
## Úvod
Transakce jsou základní jednotkou práce s relační databází. Slouží k zajištění konzistence dat při současném přístupu více uživatelů a při možných chybách systému. Tento materiál shrnuje pojmy, vlastnosti transakcí, chování v distribuovaném prostředí, protokoly potvrzování, zotavení po chybě a synchronizaci.
> Definice: Transakce je posloupnost logicky souvisejících operací, které musí být vykonány buď všechny, nebo žádná; převádí databázi z jednoho konzistentního stavu do druhého.
## Vlastnosti transakcí (ACID a další)
### Atomičnost
- Celá posloupnost operací se považuje za jednu logickou jednotku. Buď jsou provedeny všechny operace, nebo se vrátí změny (ROLLBACK).
> Definice: Atomičnost znamená, že transakce je nedělitelná; nedokončené změny se musí vrátit.
### Izolovaná vratnost (isolation + no cascading)
- Vracení jedné transakce nesmí negativně ovlivnit jiné transakce. Pokud by ano, může nastat řetězové vrácení (cascading rollback).
> Definice: Izolovaná vratnost zajišťuje, že nedokončené změny nejsou viditelné jiným transakcím.
### Pernamentnost (durability)
- Jednou potvrzené (COMMIT) změny jsou trvale uloženy a nemohou být ztraceny.
> Definice: Pernamentnost znamená, že po COMMITu jsou změny trvale zapsány na úložiště.
### Uspořádatelnost (serializovatelnost)
- Výsledek paralelního provádění transakcí musí odpovídat nějakému sériovému (pořadovému) provedení těchto transakcí.
> Definice: Serializovatelnost = možnost vysledovat výsledek paralelního běhu jako výsledek některého sériového rozvrhu.
## Lokální vs. globální (distribuované) transakce
- **Lokální transakce** přistupuje pouze k datům na jednom uzlu.
- **Globální (distribuovaná) transakce** přesahuje hranice jednoho uzlu a skládá se z dílčích lokálních transakcí na různých uzlech.
> Definice: Globální transakce je transakce, která koordinuje více lokálních transakcí napříč uzly.
## Distribuovaný databázový systém — základní principy
- Databáze je fragmentována a alokována na více uzlech s komunikačními propojeními.
- Globální transakce startuje na primárním (koordinujícím) uzlu a rozpadá se na podtransakce.
- Primární transakce (koordinátor) řídí dělení, sběr odpovědí a závěrečné rozhodnutí (COMMIT/ABORT).
### Komponenty na uzlu (přehled)
- Aplikační program
- Modul řízení transakcí (koordinační logika)
- Komunikační modul
- Moduly řízení dat (lokální DBMS)
- Operační systém, hardware
> Definice: Modul řízení transakcí zpracovává požadavky, rozděluje globální transakci, sbírá podvýsledky a sestavuje finální odpověď.
## Dvoufázový potvrzovací protokol (2PC)
Cíl: zajistit atomické potvrzení globální transakce v distribuovaném prostředí.
### Fáze 1 — hlasování (voting / prepare)
1. Koordinátor požádá všechny podtransakce, aby dosáhly bodu, kdy mohou říci, zda jsou připraveny COMMITovat (RC - ready to commit).
2. Každá podtransakce provede lokální přípravu a odpoví: RC (ready / prepared) nebo ABORT.
- Po RC si lokální uzel ještě nezpřístupní změny ostatním transakcím.
### Fáze 2 — jištění (commit/abort)
1. Pokud všechny odpovědi jsou RC, koordinátor posílá globální COMMIT a podtransakce provedou své lokální COMMIT (a změny se zviditelní).
2. Pokud alespoň jedna odpověď je ABORT nebo někdo nedosáhne RC v časovém limitu, koordinátor pošle globální ABORT a všechny podtransakce se vrátí.
> Definice: 2PC zajišťuje, že všechny zúčastněné uzly dospějí ke stejnému rozhodnutí COMMIT nebo ABORT.
### Chyby a časové ohraničení (timeouts)
Možné situace a řešení:
- Nelze inicializovat podtransakci -> koordinátor se pokusí o jiný uzel nebo pošle ABORT všem.
- Chybějící RC zpráva -> koordinátor obvykle pošle ABORT všem.
- Lokální uzel nemusí obdržet finální COMMIT/ABORT -> koordinátor zůstane aktivní dokud zprávu nedoručí.
- Koordinátor sám selže po obdržení RC -> ostatní čekají; po zotavení koordinátor rozhodne podle logu.
Fun fact: 2PC je jednoduchý a široce používaný protokol, ale trpí problémem blokování (blocking) pokud koordinátor selže, což vedlo k náv