Vlastnosti a príkazy transakcie, princíp ACID, konzistentný stav databázy.
Transakcie
Transakcie sú skupiny operácií, ktoré sa vykonávajú ako jednotka. Buď sa všetky vykonajú úspešne (commit), alebo sa v prípade chyby vráti databáza do pôvodného stavu (rollback). Tieto príkazy zaisťujú konzistenciu a integritu dát v databázach.
Základné príkazy
Write (zápis)
Skupina operácií, ktoré ukladajú alebo aktualizujú dáta v databáze (napríklad, INSERT
, UPDATE
, DELETE
). Operácie zápisu menia stav databázy, ale tieto zmeny nie sú trvalé, kým sa nevykoná COMMIT
.
BEGIN TRANSACTION;
INSERT INTO zakaznici (id, meno, priezvisko)
VALUES (1, 'Jana', 'Sedláková');
UPDATE zakaznici
SET priezvisko = 'Nováková'
WHERE id = 1;
-- zmeny ešte nie sú trvalé...
Read (čítanie)
Skupina operácií, ktoré čítajú aktuálny stav záznamu z databázy (najčastejšie sa jedná o príkaz SELECT
). Čítanie môže byť súčasťou transakcie, napríklad pre overenie podmienok pred zápisom.
BEGIN TRANSACTION;
SELECT meno FROM zakaznici
WHERE id = 1;
-- táto operácia čítania nemá vplyv na stav databázy.
Potvrdenie transakcie (COMMIT
)
Potvrdzuje všetky zmeny vykonané v rámci transakcie a robí ich trvalými. Ak sú všetky operácie v transakcii úspešné, vykoná sa COMMIT
, čím sa zmeny trvalo zapíšu do databázy. Po vykonaní tohto príkazu už nie je možné vrátiť transakciu späť (myslíme cez príkaz ROLLBACK
) .
BEGIN TRANSACTION;
INSERT INTO zakaznici (id, meno, priezvisko)
VALUES (2, 'Jozef', 'Mrkvička');
UPDATE zakaznici
SET meno = 'Peter', priezvisko = 'Novák'
WHERE id = 2;
COMMIT; -- zmeny sú teraz trvalo zapísané v databáze, a teda je zabezpečená konzistentnosť
Vrátenie transakcie (ROLLBACK
)
Zruší všetky zmeny vykonané v rámci transakcie a vráti databázu do stavu pred začiatkom transakcie. Používa sa v prípade chyby alebo nesplnenia podmienok počas transakcie.
BEGIN TRANSACTION;
INSERT INTO zakaznici (id, meno)
VALUES (1, 'Martina');
-- tu môže nastať chyba: primárny kľúč už existuje, nesplnená podmienka, atď...
ROLLBACK; -- zmeny sú zrušené, žiadny záznam v rámci transakcie sa do databázy nezapíše natrvalo
Konzistentný stav databázy
Konzistentný stav databázy znamená, že všetky dáta v databáze sú v súlade s definovanými pravidlami, obmedzeniami a integritou.
Napríklad, pri prevode peňazí medzi účtami musí byť suma odpočítaná z jedného účtu a zároveň pripočítaná k druhému. Ak dôjde k prerušeniu transakcie, žiadny z účtov nesmie byť aktualizovaný samostatne. Alebo, ak zákazník zadá objednávku v e-shope, databáza musí zaistiť že v sklade je dostatok produktov a objednávka obsahuje platné položky.
Inkonzistencia môže nastať napríklad pri vynechaní kontroly cudzích kľúčov - tabuľka objednavky
obsahuje riadok s zakaznik_id = 5
, ale tento zákazník neexistuje v tabuľke zakaznici
- to znamená že je porušená referenčná integrita databázy (sú narušené vzťahy). Ďalej môže inkonzistencia nastať napríklad ak tabuľka obsahuje duplicitné primárne kľúče - teda vo všeobecnosti vždy vtedy, keď je nejakým spôsobom porušená integrita databázy.
ACID princípy
ACID (Atomicity, Consistency, Isolation, Durability) sú kľúčové vlastnosti transakcií v relačných databázach:
- Atomicita (Atomicity) - transakcia je celok, buď sa všetky jej operácie vykonajú, alebo žiadna (napríklad, nemôže sa vykonať iba polovica);
- Konzistentnosť (Consistency) - transakcia zabezpečuje, že databáza zostáva v konzistentnom stave;
- Izolácia (Isolation) - transakcie sú navzájom izolované, aby sa zabránilo interferencii medzi rôznymi transakciami, napríklad zmenenie tej istej hodnoty súčasne;
- Trvácnosť (Durability) - po potvrdení (
COMMIT
) sú zmeny trvalé, aj pri výpadku systému (to znamená že zmeny zapíšeme do perzistentného úložiska, napríklad na disk);