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