Čo je to deadlock na databáze MySQL? Tu je jednoduchý príklad!

Deadlock je stav, v ktorom dve alebo viac procesov čaká na uvoľnenie zdroja, ktorý je držaný iným procesom, ktorý zasa čaká na uvoľnenie iného zdroja. V dôsledku toho sa žiadny z procesov nemôže pohnúť ďalej, keďže každý čaká na zdroj, ktorý je blokovaný iným procesom. Tento stav je problematický v systémoch, ktoré vyžadujú vysokú dostupnosť a výkon, napríklad v databázových systémoch.

Jednou z kľúčových charakteristík deadlocku je vzájomná výlučnosť, kedy viacero procesov nemôže súčasne využívať jeden zdroj. Inými slovami, ak jeden proces drží zámok na zdroji, žiadny iný proces nemôže tento zdroj využívať, kým prvý proces zámok neuvoľní.

V databázových systémoch ako je MySQL môže deadlock nastať napríklad pri transakciách. Keď viacero transakcií súčasne požaduje prístup k rovnakým záznamom, môže dôjsť k situácii, keď každá transakcia čaká na uvoľnenie zdrojov, ktoré sú blokované inou transakciou. Tým pádom sa žiadna z transakcií nemôže úspešne ukončiť.

Príklad deadlocku v MySQL

Deadlock v MySQL by mohol vyzerať nasledovne:

V tejto situácii sú obe transakcie v stave deadlocku, keďže každá čaká na uvoľnenie zdroja, ktorý je blokovaný tou druhou.

Jednoduchý názorný príklad deadlocku v MySQL

Tu je jednoduchý príklad, ako môže nastať deadlock v MySQL databáze. Predpokladáme, že máme tabuľku s názvom `bank_accounts` s nasledujúcimi stĺpcami: `id` a `balance`.

CREATE TABLE bank_accounts ( id INT PRIMARY KEY, balance INT ); -- Vložíme dva účty s id 1 a 2 a počiatočným zostatkom 100 INSERT INTO bank_accounts VALUES (1, 100); INSERT INTO bank_accounts VALUES (2, 100);

Predstavme si teraz dve transakcie:

Transakcia A

-- Krok 1: Transakcia A zamyká účet s id 1 START TRANSACTION; SELECT * FROM bank_accounts WHERE id = 1 FOR UPDATE;

Transakcia B

-- Krok 2: Transakcia B zamyká účet s id 2 START TRANSACTION; SELECT * FROM bank_accounts WHERE id = 2 FOR UPDATE;

Transakcia A (pokračovanie)

-- Krok 3: Transakcia A chce zamyknúť účet s id 2, ale nemôže, pretože je už zamknutý Transakciou B SELECT * FROM bank_accounts WHERE id = 2 FOR UPDATE;

Transakcia B (pokračovanie)

-- Krok 4: Transakcia B chce zamyknúť účet s id 1, ale nemôže, pretože je už zamknutý Transakciou A SELECT * FROM bank_accounts WHERE id = 1 FOR UPDATE;

V tomto bode sme dosiahli deadlock. Transakcia A čaká na uvoľnenie účtu s id 2, ktorý je zamknutý Transakciou B, a Transakcia B čaká na uvoľnenie účtu s id 1, ktorý je zamknutý Transakciou A. Obe sú v nekonečnom stave čakania.

MySQL má detekčný mechanizmus na rozpoznanie deadlockov a obvykle jednu z transakcií automaticky zruší, aby umožnila druhej pokračovať. Vývojári by však mali byť oboznámení s možnosťou vzniku deadlocku a navrhovať svoje aplikácie tak, aby minimalizovali riziko jeho vzniku.

Správcovia databázy a vývojári môžu používať rôzne techniky na detekciu a riešenie deadlockov, napríklad časové limity na transakcie alebo špeciálne algoritmy na detekciu deadlockov. Niektoré databázové systémy, vrátane MySQL, majú vstavané mechanizmy na automatickú detekciu a rozriešenie deadlockov.

Je dôležité si uvedomiť, že deadlocky môžu výrazne ovplyvniť výkon a spoľahlivosť databázových systémov. Preto je ich identifikácia a riešenie kritické pre správu efektívnych a robustných databázových aplikácií.

Ako začať programovať?

Úvod do programovania pre každého bez prechádzajúcich znalostí.

Stiahnite so náš ebook teraz výnimočne zdarma!!!

Marián Knězek

 

Súvisiace články: