[Bazy danych] wielodostępność

0

Witam,

google mnie nie pogryzlo, ale tez nie wiem czego dokladnie szukac. Problem jest taki:
dwoch uzytkownikow pobiera te same dane z bazy, edytuja je na rozne sposoby i po kolei zapisuja z powrotem.
Sa jakies wzorce projektowe czy cos co sprawi ze druga zapisujaca osoba bedzie wiedziala, jakie zmiany zaszly w daych w miedzyczasie?

0

poczytaj sobie o blokowaniu optymistycznym i pesymistycznym. Ogólnie kto pierwszy zaczyna zmieniać rekord ten go blokuje nie pozwalając na edycje przez innych. Od sposobu blokowania zależy tylko kiedy inny user się o tym dowie

0

Wlasciwie to chcialem napisac system tak, zeby nie istnialo blokowanie rekordow, bo moglyby byc bardzo dlugo zablokowane. Poczytalem troche o systemach kontroli wersji. Znajomy mi poradzil bym dodal do tabel kolumne ktora bylaby licznikiem wersji. Czyli system dzialalby tak:

  • uzytkownik pobiera dane ktoregos rekordu do edycji (razem z aktualnym licznikiem wersji)
  • edytuje dane
  • w tym czasie ktos inny updatuje te same dane w bazie i licznik wersji w bazie sie zwieksza
  • nasz uzytkownik postanawia zapisac dane. System najpierw sprawdza, ze licznik wersji w bazie jest wiekszy i informuje o tym uzytkownika. \
I w zaleznosci od tego podejmowane sa dalej jakies decyzje. Co myslicie o takim rozwiazaniu?
0

A co będzie, jeśli użytkownik A załózmy, pobierze dane z licznikiem, dokona operacji, potem przed zapisem sprawdzi stan licznika i załóżmy, ze stan się nie zmienił, ale w tym momencie wpada użytkownik 2 z zapisem do bazy, zmienia licznik i znów jest problem.. Troche to jest problematyczne, bo licznik się zmienia po sprawdzeniu, a przed wstawieniem danych

0

Powiedzmy ze zapis realizowany jest w transakcji, która decyduje czy zapisac nowe dane czy pobrac te zedytowane. Prawdopodobienstwo, ze ktos akurat sie tak "wtraci" jest niewielkie, a nawet jesli to tansakcja to wykryje. A moze sa jednak lepsze rozwiazania?

0

zrób tak jak poradził Ci znajomy - dodaj timestamp/licznik wersji, tylko nie rób sprawdzania timestamp'a przed update'em jako osobnego zapytania, tylko wrzuć go do warunku WHERE w UPDATE, po warunku na klucz główny; jeśli inny użytkownik zapisał nowszą wersję, UPDATE się nie powiedzie - będziesz mógł to wychwycić i w zależności od strategii - odświeżyć rekord lub go nadpisać.

natomiast blokowanie rekordów imho i tak będzie miało miejsce w sytuacji kiedy kilka sesji będzie chciało naraz zapisać ten sam rekord; timestamp pozwala na brak blokady przy odczytywaniu rekordów przez kilka sesji jednocześnie.

0

Blokowania rekordów nie wolno dokonywać na cały czas edycji (mogłoby trwać kilka minut) a jedynie na zapis zmian, który trwa mniej niż milisekundę. Najczęściej jeśli zmiany nie zachodzą na siebie to nie trzeba się przejmować że drugi użytkownik zmienił wartość pola rekordu chociaż nie miał jego najświeższej wersji, ale oczywiście jeśli istnieje istotny powód że chcemy mieć całkowitą pewność, to może zastosować dodatkowe pole z numerem wersji i nie pozwolić na zmiany jeśli inny numer wersji wskazuje na to, że rekord nie jest odświeżony. Stosowałem takie rozwiązania z maksymalnym poziomem izolowania transakcji (snapshot).

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