Middle
Какви са блокировките в контекста на работата с бази данни и защо са необходими?
sobes.tech AI
Отговор от AI
Блокировките в база данни са механизми, използвани за управление на достъпа на няколко потребители или процеси до едни и същи данни едновременно. Те предотвратяват конфликти и поддържат цялостта на данните в конкурентна среда.
Необходими са за решаване на следните проблеми:
- Race Conditions: Ситуация, при която редът на изпълнение на операциите влияе върху крайния резултат. Блокировките гарантират, че операциите ще се изпълняват последователно или в безопасен за данните ред.
- Несъвместимо четене (Inconsistent Reads): Един процес чете данни, докато друг ги променя, което може да доведе до получаване на междинно или непълно състояние на данните. Блокировките могат да предотвратят това.
- Загубени актуализации (Lost Updates): Два процеса четат едни и същи данни, всеки ги променя и след това ги запазва. Последното запазване презаписва промените на първия, като по този начин ги губи. Блокировките помагат да се избегне загубата на промени.
- Фантомно четене (Phantom Reads): В рамките на една транзакция повторният заявка връща друг набор от редове, защото друг процес е добавил или премахнал редове, съответстващи на условията на заявката.
Основни типове блокировки:
- Споделена (Shared/Read Lock): Позволява на няколко транзакции да четат едни и същи данни едновременно. Не позволява write-блокировки на същите данни.
- Ексклузивна (Exclusive/Write Lock): Предоставя монополен достъп до данните. Само една транзакция може да има exclusive-блокировка върху определени данни в даден момент. Не позволява нито read, нито write-блокировки на същите данни.
Блокировките могат да бъдат приложени на различни нива:
- Ниво на базата данни: Блокира цялата база данни. Рядко се използва.
- Ниво на таблицата: Блокира цялата таблица. По-малко детайлно, може да намали конкуренцията.
- Ниво на реда: Блокира отделен ред. По-детайлно, поддържа висока конкуренция, но може да изисква повече ресурси.
- Ниво на страница: Блокира страница с данни (единица за съхранение в СУБД, съдържаща няколко реда). Компромис между блокиране на таблица и ред.
Реализацията на блокировките зависи от конкретната СУБД (например, InnoDB и MyISAM в MySQL имат различни стратегии за блокировки, PostgreSQL и др.). В PHP често се използват транзакции за управление на блокировките.
-- Пример за използване на транзакция и блокировка в SQL
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE налага ексклузивна блокировка върху избраната редица
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
COMMIT;
-- Или ROLLBACK при грешка