Zkratka proAtomicity, Consistency, Isolation, DurabilityTakéACID vlastnosti, ACID transakcePokročilý

Definice

ACID je sada čtyř vlastností databázové transakce: atomicity, consistency, isolation a durability. Zaručuje, že skupina zápisů proběhne jako jeden celek, neporuší definovaná pravidla databáze, nebude se nebezpečně míchat s jinými transakcemi a po potvrzení přežije pád systému, například při převodu peněz.

Kategorie: DatabázeAktualizováno

Čtyři sliby ACID transakce

ACID shrnuje vlastnosti, které databáze slibuje u transakcí. Transakce je hranice kolem několika čtení a zápisů, které aplikace bere jako jednu logickou operaci. Bez takové hranice by se při pádu serveru, výpadku spojení nebo souběžném zápisu mohly uložit jen části změn.

  • Atomicity říká, že transakce skončí celá, nebo vůbec. Když druhý zápis selže, databáze vrátí i první zápis zpět.
  • Consistency znamená, že potvrzená transakce zachová pravidla definovaná ve schématu a v databázi, například cizí klíče, unikátní hodnoty nebo kontrolní omezení.
  • Isolation omezuje, co souběžné transakce vidí jedna od druhé. Cílem je, aby mezistavy jedné operace nerozbily rozhodování jiné operace.
  • Durability zajišťuje, že potvrzená změna nezmizí jen proto, že proces spadne nebo se restartuje server.

Co se pokazí bez ACID

Bankovní převod ukazuje problém nejrychleji. Odečtení částky z jednoho účtu a přičtení na druhý účet musí patřit k sobě. Kdyby se uložilo jen odečtení, peníze by se ztratily. Kdyby dvě pokladny současně prodaly poslední kus zboží, vznikla by objednávka, kterou sklad neumí splnit. ACID z těchto situací nedělá automaticky správný byznys proces, ale dává databázi mantinely, ve kterých se proces může bezpečně provést.

Izolace není jedna poloha

Izolace má v praxi různé úrovně. Některé databáze dovolují rychlejší čtení, které může vidět starší nebo méně přísně oddělený stav. Přísnější úroveň, typicky serializovatelná izolace, se chová blíž tomu, jako by transakce běžely jedna po druhé. Volba úrovně izolace je kompromis mezi srozumitelností výsledku, počtem konfliktů a výkonem při souběžné zátěži.

Cena za pevné záruky

Silné transakční záruky nejsou zadarmo. Databáze musí vést transakční log, zamykat řádky nebo verze dat, řešit konflikty a při potvrzení zajistit zápis na odolné úložiště. U krátkých transakcí bývá cena přijatelná. U dlouhých transakcí, hromadných importů nebo distribuovaných systémů může ACID zvyšovat latenci a blokovat další práci.

ACID mimo klasické SQL

Moderní databáze nepoužívají ACID jen v relačním světě. Dokumentové nebo distribuované databáze mohou nabízet transakce také, ale rozsah záruk se liší: někdy platí pro jeden dokument, jindy pro více kolekcí, shardů nebo uzlů. Důležité je číst konkrétní dokumentaci databáze, protože slovo transakce samo o sobě neříká, jaká izolace a trvalost se skutečně poskytuje.

Příklady z praxe

  1. Převod peněz mezi účty

    Aplikace převádí 1000 Kč z účtu 1 na účet 2. Pokud druhý příkaz selže kvůli poruše nebo omezení, transakce se nepotvrdí a první odečtení se vrátí zpět. Výsledkem není stav, ve kterém peníze zmizely mezi účty.

    BEGIN;
    UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
    UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
    COMMIT;
  2. Rezervace posledního kusu

    E-shop má poslední kus produktu a dvě objednávky přijdou skoro současně. Zámek nad řádkem zabrání tomu, aby obě transakce rozhodly podle stejného starého počtu kusů. Jedna objednávka projde a druhá musí počkat nebo skončit jako neúspěšná.

    BEGIN;
    SELECT stock FROM products WHERE id = 42 FOR UPDATE;
    UPDATE products SET stock = stock - 1 WHERE id = 42 AND stock > 0;
    INSERT INTO orders (product_id, quantity) VALUES (42, 1);
    COMMIT;

Časté omyly

MýtusACID znamená, že databáze nikdy nebude obsahovat chybná data.
Ve skutečnostiACID chrání hlavně průběh transakcí a databázová omezení. Databáze může korektně uložit i věcně špatnou hodnotu, pokud ji aplikace pošle a schéma ji povolí.
MýtusIzolace v ACID vždy znamená serializovatelnost.
Ve skutečnostiIzolace je vlastnost ACID, ale konkrétní databáze často nabízí několik úrovní izolace. Výchozí nastavení nemusí být nejpřísnější a může připouštět jevy, které serializovatelná izolace odmítá.
MýtusNoSQL databáze ACID neumí.
Ve skutečnostiNěkteré nerelační databáze podporují ACID transakce, ale jejich rozsah a omezení se liší podle produktu a konfigurace. Správná otázka není jen zda databáze ACID umí, ale pro jaké operace a s jakou izolací.

Časté dotazy

Proč samotný COMMIT nestačí k pochopení ACID?
ACID transakce řeší celou hranici operace, zatímco COMMIT je jen okamžik, kdy aplikace žádá databázi o potvrzení změn. Databáze při potvrzení musí dokončit zápisy, ověřit omezení, vyřešit konflikty izolace a zajistit trvalost. Neúspěšný COMMIT proto může znamenat, že se celá transakce zrušila a aplikace musí operaci zopakovat nebo uživateli oznámit chybu.
Kdy ACID zpomalí databázovou aplikaci?
ACID může databázovou aplikaci zpomalit hlavně při vysoké souběžnosti, dlouhých transakcích a zápisech, které se dotýkají stejných dat. Přísná izolace zvyšuje počet čekání nebo opakování transakcí. Trvalost zase vyžaduje bezpečné uložení transakčního logu. Dopad závisí na databázi, nastavení úrovně izolace, typu úložiště a délce transakcí.
Má ACID smysl i u jedné tabulky?
ACID má smysl i u jedné tabulky, pokud jedna logická operace mění více řádků nebo nesmí zůstat rozpracovaná. Příkladem je hromadná změna cen, přepočet pořadí nebo přesun položek mezi stavy. Bez transakce může pád aplikace zanechat polovinu řádků upravenou a polovinu ve starém stavu, což uživatelé často vnímají jako poškozená data.
Je ACID možné v distribuované databázi?
ACID se nevylučuje s distribuovanou databází, ale splnění všech vlastností přes více uzlů bývá náročnější. Distribuovaný systém musí řešit výpadky sítě, replikaci, pořadí zápisů a potvrzení na více místech. Některé databáze proto omezují rozsah transakcí, používají slabší výchozí izolaci nebo dávají vývojáři možnost volit mezi latencí, dostupností a silnější konzistencí.

Zdroje

  1. 3.4. Transactions(otevře se v novém okně)PostgreSQL Global Development Group
  2. Chapter 13. Concurrency Control(otevře se v novém okně)PostgreSQL Global Development Group
  3. SQLite Is Transactional(otevře se v novém okně)SQLite Consortium
  4. Transactions(otevře se v novém okně)MongoDB, Inc.
  5. ACID(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.