Lock na bazie danych

0

Witajcie,
Dzisiaj mam do was pytanie dotyczące asynchronicznego programowania i baz danych.
Wyobraźmy sobie taką sytuacje:

  1. Program pobiera imiona osób z REST'owego API np:
[
    {
        "name":"Michał"
    }
}
  1. Pobieramy już istniejące imiona z naszej bazy (SELECT name FROM names)
  2. Usuwamy istniejące już imiona z imion zwróconych przez API (nie usuwamy imion z bazy z której korzysta REST'owe API)
  3. Wykonujemy jakieś czynności z nowymi imionami
  4. Wstawiamy do bazy nowe imiona

Jeżeli tą operację będzie wykonywać równolegle kilka instancji programu, istnieje sytuacja że "czynności" na nowych imionach zostaną wykonane kilka razy, oraz ze nowe imiona zostaną wstawione ponownie do bazy. Jak tego uniknąć?
Jeżeli byłaby mowa o jednej instancji aplikacji, najprościej było by użyć bloku synchronized.
Transakcje nie wchodzą tu w grę, ponieważ nie możemy zablokować nie istniejących rekordów (chodzi o moment kiedy nowe imiona nie zostały jeszcze wstawione do bazy, ale już przetworzone).

1

Zaakceptować smutny fakt, że nowe imiona zostaną kilkukrotnie przetworzone na nieskomunikowanych instancjach aplikacji (chyba, że dodajemy komunikację pomiędzy klientami). Dodać odpowiedni constraint po stronie bazy i dorobić obsługę błędów przy jego naruszeniu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1