Řízení transakcí a zamykání

Transakce

Transakce je logická jednotka práce v databázovém systému. Jedna transakce se skládá z jedná či několika databázových operací (např. čtení, zápis, aktualizace), které z pohledu uživatele tvoří jeden celek.

Platí zde zásadní pravidlo atomicity (všechno nebo nic):

Pro ovládání transakcí používá SŘBD následující příkazy:

Transakce během svého provádění postupně prochází několika stavy. Pochopení těchto stavů je klíčové pro případnou diagnostiku chyb, ke kterým může v databázovém systému docházet.

  1. active (aktivní) – výchozí stav; transakce právě probíhá, vykonávají se jednotlivé operace
  2. partially committed (částečně potvrzená) – došlo k vykonání poslední operace, ale data ještě fyzicky nejsou zapsána na disk (nacházejí se např. v operační paměti) – čeká se na finální potvrzení
  3. committed (potvrzená) – úspěšné ukončení, data jsou bezpečně a trvale zapsána, transakce končí
  4. failed (chybná) – nastala chyba (např. porušení integrity dat, deadlock, atp.) – transakce nemůže být dokončena a musí být zrušena
  5. aborted (zrušená) – stav po provedení ROLLBACKu – transakce odstranila všechny částečně potvrzené změny a systém se nachází ve stavu, jako kdyby transakce ani nikdy nezačala

Příklady

Scénář 1 – Adam posílá Evě 1000 Kč.

počáteční stav účtu Adam: 5000 Kč, počáteční stav účtu Eva: 2000 Kč

KrokOperace / SQL příkazStav transakceCo se děje v systému
1.START TRANSACTIONactiveSystém zahajuje transakci. Vytváří se virtuální „stav“, ve kterém se změny dějí, ale zatím nejsou vidět navenek.
2.UPDATE Ucty SET castka = castka - 1000 WHERE klient = 'Adam';activeAdamovi se v paměti odečetlo 1000 Kč.
Pozor: V databázi na disku má Adam stále 5000, změna je jen v transakčním logu/paměti.
3.UPDATE Ucty SET castka = castka + 1000 WHERE klient = 'Eva';partially committedPoslední operace proběhla. Systém zkontroloval, že oba příkazy jsou syntakticky správně a že je lze provést.
4.COMMITcommitted„Razítko“. Systém zapíše změny trvale na disk. Uvolní se zámky na účtech Adama a Evy.
5.Konec procesucommitted / finishedOstatní uživatelé nyní vidí, že Adam má 4000 Kč a Eva 3000 Kč.

Díky tomu, že transakce proběhla celá (obě operace), je systém stále v konzistentním stavu. Peníze se přesunuly a nikam se neztratily.

Scénář 2 – Chyba během provádění transakce

Zákazník si chce v e-shopu objednat poslední kus notebooku, ale během procesu dojde k porušení logiky databáze (například dojde k chybě sítě nebo k chybě při zápisu na disk).

Cíl: vytvořit novou objednávku, přidat do ní zboží a odečíst kus ze skladu.

KrokOperace / SQL příkazStav transakceCo se děje v systému
1.START TRANSACTIONactiveZahájení transakce.
2.INSERT INTO Objednavky (zakaznik, datum) VALUES ('Petr', NOW());activeVytvořil se záznam s objednávkou. Systém tento záznam zamkne.
3.INSERT INTO ObjednavkyPolozky (ID, zbozi) VALUES (LAST_INSERT_ID(), 'Notebook';activeVytvořil se záznam s položkou objednávky. Systém tento záznam zamkne.
4.UPDATE Sklad SET pocet = pocet - 1 WHERE zbozi = 'Notebook';activeSklad se snížil na 0. Zatím vše vypadá dobře.
5.CHYBA! (Výpadek sítě)failedPředstavme si situaci: Databáze zjistí, že během kroku 4 dojde k chybě zápisu na disk. Systém hlásí: „Nelze pokračovat.“
6.Automatická reakce systémufailed -> abortedProtože nelze provést COMMIT, systém musí vyčistit „rozpracovanou práci“. Spustí se ROLLBACK.
7.ROLLBACK (Automaticky)ZrušenáSystém se podívá do logu a vrátí změny zpět:
1. Vrátí počet kusů na skladě na 1.
2. Smaže (odvolá) vytvořený záznam v Objednávkách.
3. Smaže (odvolá) vytvořený záznam v položkách objednávek.

Kdyby SŘBD neuměl pracovat s transakcemi, mohlo by se stát, že objednávka zůstane vytvořená (kroky 2 a 3), ale zboží se neodečte (nebo naopak). Díky operaci ROLLBACK se databáze vrátila přesně do stavu, v jakém byla před krokem 1. Z pohledu databáze se tedy „nic nestalo“.

Zamykání

Databázový systém přirozeně umožňuje práci většímu počtu uživatelů najednou – databázové systémy jako například SAP HANA umožňují, aby se systémem pracovaly stovky i tisíce uživatelů ve stejný čas. V takovém případě je samozřejmě životně důležité zajistit, aby si „nelezli do zelí“. A právě k tomu slouží zamykání.

Cílem zamykání (locking) je zabránit tomu, aby se databáze dostala do nekonzistentního stavu (například dva lidé vyberou peníze ze stejného účtu v naprosto shodný čas a dostanou účet do mínusu, aniž by o tom systém věděl).

Rozlišujeme dva základní typy zámků podle toho, jak moc ostatní uživatele potřebujeme omezit:

Příklady použití S-locku

Příklady použití X-locku

Problém deadlocku (uváznutí)

Při zamykání může nastat velmi specifická a nebezpečná situace zvaná DEADLOCK – jedná se o případ, kdy dvě (nebo více) transakcí čekají na uvolnění zdrojů, které drží ta druhá transakce. Ani jedna transakce nemůže pokračovat a čekaly by tedy do nekonečna.

Příklad deadlocku

Jak SŘBD tedy deadlock řeší?

Databázový systém musí umět tuto situaci detekovat a vyřešit:

  1. Detekce a Rollback: SŘBD zjistí, že došlo k cyklickému čekání. Vybere jednu transakci (oběť), tu násilně ukončí (ROLLBACK), čímž uvolní zdroje pro druhou transakci.
  2. Timeout (Časový limit): Nastaví se maximální doba čekání na zámek. Pokud transakce čeká příliš dlouho (např. 60 sekund), systém předpokládá problém a automaticky provede ROLLBACK.
SQL příkaz pro zahájení transakce

START TRANSACTION;

Co je to deadlock v db systému?

Situace, kdy dvě nebo více transakce čekají na uvolnění zdrojů, které drží jiná transakce v téže skupině a žádná tudíž nemůže pokračovat.

Atomicita

Vlastnost databáze „všechno nebo nic“ – transakce se provede buďto celá, nebo vůbec.

Uveďte příklad použití sdíleného zámku

Při generování měsíční faktury – ostatní mohou číst, ale nesmí měnit.

Jak se označuje výlučný zámek, který záznam zamkne pro změnu i čtení?

X-lock (eXclusive)

SQL příkaz pro storno transakce

ROLLBACK

Jaký je hlavní cíl zamykání v db systémech?

Zabránit tomu, aby se databáze dostala do nekonzistentního stavu při souběžném přístupu více uživatelů.

Jak se v MariaDB jmenuje záchytný bod, ke kterému se vracíme v případě neúspěšné transakce?

SAVEPOINT

Jak se označuje zámek, který uzamkne záznam pro zápis, ale čtení povolí?

S-lock (Shared)

Jak SŘBD řeší deadlock?

SŘBD zjistí cyklické čekání a vybere jednu transakci a násilně ji ukončí pomocí ROLLBACK.

Jaké jsou dva hlavní typy zámků v dbs?

S-lock a X-lock (Shared, eXclusive)

Transakce (definice)

Logická jednotka skládající se z jedné či několika databázových operací, které z pohledu uživatele tvoří jeden nedělitelný celek.