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