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 при грешка