Sobes.tech
Middle

Čo sú zámky v kontexte práce s databázami a prečo sú potrebné?

sobes.tech AI

Odpoveď od AI

Zámky v databáze sú mechanizmy používané na riadenie prístupu viacerých používateľov alebo procesov k rovnakým údajom súčasne. Zabraňujú konfliktom a udržiavajú integritu údajov v konkurenčnom prostredí.

Sú nevyhnutné na riešenie nasledujúcich problémov:

  • Race Conditions: Situácia, keď poradie vykonávania operácií ovplyvňuje konečný výsledok. Zámky zabezpečujú, že operácie budú vykonávané sekvenčne alebo v bezpečnom poradí.
  • Nezlučiteľné čítanie (Inconsistent Reads): Jeden proces číta údaje, zatiaľ čo iný ich mení, čo môže viesť k získaniu medzi stavov alebo neúplných údajov. Zámky tomu môžu zabrániť.
  • Stratené aktualizácie (Lost Updates): Dva procesy čítajú rovnaké údaje, každý ich mení a potom ich ukladá. Posledné uloženie prepíše zmeny prvého, čím ich stratí. Zámky pomáhajú zabrániť strate zmien.
  • Fantomové čítanie (Phantom Reads): V rámci jednej transakcie opakovaný dopyt vracia iný súbor riadkov, pretože iný proces pridal alebo odstránil riadky zodpovedajúce podmienkam dopytu.

Hlavné typy zámkov:

  • Zdieľaný (Shared/Read Lock): Umožňuje viacerým transakciám čítať rovnaké údaje súčasne. Neumožňuje write-zámky na tie isté údaje.
  • Exkluzívny (Exclusive/Write Lock): Poskytuje monopolný prístup k údajom. Len jedna transakcia môže mať exkluzívny zámok na určité údaje v danom momente. Neumožňuje ani read, ani write-zámky na tie isté údaje.

Zámky môžu byť aplikované na rôznych úrovniach:

  • Úroveň databázy: Zamkne celú databázu. Zriedka sa používa.
  • Úroveň tabuľky: Zamkne celú tabuľu. Menej detailné, môže znížiť konkurencieschopnosť.
  • Úroveň riadku: Zamkne samostatný riadok. Viac detailné, podporuje vysokú konkurencieschopnosť, ale môže vyžadovať viac zdrojov.
  • Úroveň stránky: Zamkne stránku údajov (jednotka úložiska v SDB, obsahujúca niekoľko riadkov). Kompromis medzi zamknutím tabuľky a riadku.

Implementácia zámkov závisí od konkrétnej SDB (napríklad, InnoDB a MyISAM v MySQL majú odlišné stratégie zámkov, PostgreSQL atď.). V PHP sa často používajú transakcie na riadenie zámkov.

-- Príklad použitia transakcie a zámku v SQL
START TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE ukladá exkluzívnu zámku na vybraný riadok

UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;

COMMIT;
-- Alebo ROLLBACK pri chybe