Wraz z pojawieniem się baz danych wieloużytkownikowych pojawił się problem — ograniczenie jednoczesnej zmiany tych samych danych. Doprowadziło to do powstania różnych mechanizmów zarządzania blokadami (lock management), które zapobiegają równoległym zmianom i pomagają utrzymać integralność danych.
Bez kontroli dostępu równoległe operacje mogą prowadzić do uszkodzenia lub utraty danych: na przykład, dwie transakcje jednocześnie aktualizują ten sam wiersz, a zmiany jednej transakcji są tracone. Zbyt luźne blokady prowadzą do problemów współzawodnictwa (race conditions), a ich nadmiar do strat wydajności (deadlocks, contention).
W nowoczesnych systemach DBMS istnieją poziomy blokad (row-level, page-level, table-level) oraz różne tryby (shared, exclusive, update). Programista może nimi zarządzać poprzez ustawienia izolacji transakcji oraz jawne komendy blokady (np. SELECT ... FOR UPDATE).
Przykład kodu:
-- Blokada wiersza do zakończenia transakcji BEGIN TRANSACTION; SELECT * FROM users WHERE id = 1 FOR UPDATE; UPDATE users SET name = 'New Name' WHERE id = 1; COMMIT;
Kluczowe cechy:
Jaka jest różnica między blokadą do odczytu (shared lock) a blokadą do zapisu (exclusive lock)?
Blokada shared pozwala wielu transakcjom na jednoczesne odczytywanie danych, ale nie pozwala na ich modyfikację. Blokada exclusive pozwala tylko jednej transakcji na zmianę danych, a pozostałym zabrania dostępu.
Czy komenda SELECT może wywołać blokadę?
Zazwyczaj SELECT nie wywołuje blokad, ale jeśli użyć SELECT ... FOR UPDATE lub przy wysokim poziomie izolacji (np. SERIALIZABLE), DBMS może zablokować wiersze.
Przykład kodu:
SELECT * FROM products WHERE id = 10 FOR UPDATE;
Czy blokady zawsze chronią przed "utraconymi aktualizacjami"?
Nie, jeśli niewłaściwie dobierze się poziom blokady lub izolacji, można otrzymać "lost update" — gdy zmiany jednej transakcji są tracone przez inną. Należy starannie wybierać mechanizmy zarządzania współbieżnością.
W dziale analizy dwie programy jednocześnie aktualizują statusy zamówień. Aby przyspieszyć, celowo ustawiono poziom READ UNCOMMITTED, aby nie blokować wierszy. Doprowadziło to do konfliktów i "utraconych" aktualizacji, część danych została uszkodzona.
Zalety:
Wady:
W dziale sprzedaży krytyczne miejsca opakowano TRANSACTION + SELECT ... FOR UPDATE. Rozgraniczono operacje odczytu i aktualizacji na poziomie wierszy.
Zalety:
Wady: