Blokada elementów bazy danych – DB lock

Bazy danych w celu uniknięcia problemów z równoległym dostępem do danych udostępniają mechanizm blokowania (database lock).

Czego może dotyczyć blokada?

Blokada może dotyczyć różnych elementów bazy danych, takich jak:

  • całej bazy danych
  • plików (przechowujących dane)
  • strony (struktura za pomocą której przechowywane są dane w plikach)
  • tabeli
  • kolumny (nie jest wspierane przez wszystkie bazy danych)
  • wiersza

Typy blokad

Blokada współdzielona (shared lock) – jest tworzona przy odczycie danych. Pozwala innym transakcjom tylko na współbieżny odczyt, jeśli będą chciały coś zmodyfikować to muszą czekać na zwolnienie blokady.

Przykład: Jeśli użytkownik A rozpocznie odczyt danych, to na cały czas trwania odczytu będzie przydzielona blokada współdzielona, przez co użytkownik B (chcący dokonać modyfikacji zasobu będzie musiał poczekać na zwolnienie blokady. A użytkownik C (chcący odczytać dane z zasobu) nie będzie musiał czekać na zwolnienie blokady, co ilustruje poniższy obraz:

Blokada wyłączająca (exclusive lock) – jest ustanawiana przy modyfikacji danych. Blokuje inne transakcje przed jakimikolwiek operacjami.

Przykład: Jeśli użytkownik A rozpocznie modyfikację zasobu, to zarówno użytkownik B (chcący dokonać modyfikacji) jak i użytkownik C (chcący dokonać odczytu), będą musieli poczekać na zwolnienie blokady, co ilustruje poniższy obraz:

Ciekawostki

  1. Ustanowienie połączenia do bazy danych powoduje powstanie współdzielonej blokady – przez co inne sesje nie mogą zrobić na przykład drop database dopóki ustanowione połączenie nie zostanie zamknięte.
  2. Niektóre bazy danych udostępniają też inne rodzaje blokad:
    https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
    https://www.postgresql.org/docs/current/explicit-locking.html