database locking strategy - ghdrako/doc_snipets GitHub Wiki

  1. Optymistyczne blokowanie (Optimistic Locking)

    • Mechanizm:
      • Przy odczycie danych zapisywana jest informacja o ich wersji (np. version number lub timestamp).
      • Przed zapisaniem danych sprawdzane jest, czy wersja danych w bazie nie uległa zmianie.
      • Jeśli wersja jest taka sama, dane są zapisywane; w przeciwnym razie operacja kończy się błędem, a aplikacja musi podjąć odpowiednie kroki.
    • Zalety:
      • Brak potrzeby blokowania wierszy w bazie przez dłuższy czas.
      • Lepsza wydajność w środowiskach o niskim poziomie współbieżności.
    • Wady:
      • Wysoki poziom współbieżności może prowadzić do wielu konfliktów, co wymaga częstego powtarzania operacji.
  2. Pesymistyczne blokowanie (Pessimistic Locking)

    • Mechanizm:

      • Przy odczycie danych wiersz jest blokowany do czasu zakończenia transakcji (SELECT ... FOR UPDATE w MySQL/PostgreSQL). Inne transakcje próbujące odczytać te same dane muszą czekać na zwolnienie blokady.
      START TRANSACTION;
      SELECT balance FROM account WHERE account_id = 7 FOR UPDATE;
      -- Race condition free update after processing the data
      UPDATE account SET balance = 540 WHERE account_id = 7;
      COMMIT;
      
    • Zalety:

      • Gwarantuje, że dane nie zostaną zmodyfikowane przez inną transakcję w trakcie aktualizacji.
      • Unika konfliktów, które występują w przypadku optymistycznego blokowania.
    • Wady:

      • Może powodować blokady i problemy z wydajnością w przypadku długotrwałych transakcji.
      • Potencjalne ryzyko deadlocków.
  3. Atomiczne operacje na poziomie bazy (Atomic Updates)

    • Mechanizm:
      • Wykorzystuje pojedyncze instrukcje SQL do aktualizacji danych w bazie (np. UPDATE z warunkiem WHERE opartym na bieżącym stanie danych). Przykład:
      UPDATE account
      SET balance = balance - 100
      WHERE account_id = 7 AND balance >= 100;
      
    • Zalety:
      • Brak konieczności stosowania blokad na poziomie aplikacji.
      • Szybkość i wydajność w prostych scenariuszach.
    • Wady:
      • Ograniczona elastyczność w bardziej złożonych przypadkach.
      • Trudności z walidacją danych przed aktualizacją.
  4. Mechanizmy blokad zewnętrznych (External Locking Mechanisms)

    • Mechanizm:
      • Wykorzystanie systemów zewnętrznych, takich jak Redis, DynamoDB, czy systemy plików, do zarządzania blokadami.
      • Przykład: Użycie kluczy Redis z czasem życia (TTL) do zabezpieczania zasobów.
    • Zalety:
      • Elastyczność w środowiskach rozproszonych.
      • Niezależność od bazy danych.
    • Wady:
      • Złożoność implementacji i możliwość wystąpienia problemów, takich jak niespójność stanu blokad.
      • Potencjalne problemy z wydajnością i spójnością w środowiskach rozproszonych.
  5. Transakcje z izolacją na poziomie SERIALIZABLE

    • Mechanizm:
      • Wykorzystanie wysokiego poziomu izolacji transakcji, który symuluje wykonywanie operacji sekwencyjnie, nawet jeśli są one wykonywane równolegle.
      • Zapewnia, że żadna transakcja nie wpłynie na wynik innej transakcji.
    • Zalety:
      • Brak konieczności ręcznego zarządzania blokadami.
      • Najwyższy poziom spójności danych.
    • Wady:
      • Znaczny spadek wydajności w przypadku dużej liczby równoczesnych transakcji.