Aplikacja rozproszona - synchronizacja

0

Cześć mam pytanie,
Czy istnieje jakiś łatwy sposób pisania aplikacji komunikującej się z bazą dla wielu użytkowników, w taki sposób, że jeśli jeden użytkownik modyfikuje jakieś dane, drugi użytkownik może tylko te dane tyko przeglądać. Po prostu aby nie doszło do sytuacji że np. pierwszy użytkownik usunie np. jakiś produkt a drugi akurat ten produkt będzie edytował, lub pierwszy użytkownik zmodyfikuje dane produktu, a drugiemu ciągle będą się wyświetlać stare dane bo nie odświeżył widoku.
Pytanie dotyczy ogólnie aplikacji pisanych w Net (głównie winfForms, wps)

0

glownie uzywam MS SQL Server, wiec bardziej moja wypowiedz bedzie w kontekscie tego serwera baz danych, ale inne maja podobne, przynajmniej teoretycznie rozwiazania
wiec sql server zaklada blokady na rozne obiekty (w rozumieniu bazy danych, czyli tabele, strony, wiersze, indeksy, ...) w zaleznosci od isolation level i od zapytania
mozna takze zakladac blokady recznie, ale nie na obiekty bazy danych, tylko chyba dla jakis indentyfikatorow (nie pamietam szczegolow, musisz doczytac)
moza sprobowac to wykorzystac

jesli twoja aplikacja nie ma jakiejs warstwy dostepu do danych, to i tak musisz napisac wlasne rozwiazanie w oparciu o baze
jesli masz jakis DAL lub serwer, ktory jest warstwa miedzy aplikacja a baza, mozesz takie rozwiazanie zaimplementowac ta tym poziomie
mozesz takze uzywac timestamp, aby uniknac modyfikacji danych zmienionych w miedzyczasie przez innych

kombinacja blokad i timestamp powinna byc najlepszym rozwiazaniem, nalezy jeszcze pomyslec jak udostepnic dane do edycji, wydaje sie ze po jednym obiekcie w tej sytuacji powinno byc najsensowniejszym rozwiazaniem
oraz jak zwalniac ewentualne blokady, aby nie wisialy w nieskonczonosc

0

@msm tu nie chodzi o aplikację tylko o bazę
@Rozproszony tutaj jest sprawa trochę bardziej zagmatwana

  1. generalnie nie robi się tak, że jak ktoś zmieni dane w bazie to się wszystkim odświeżają. Nie robi się tego z dwóch podstawowych powodów - po pierwsze aby nie zajechać bazy oraz było by lekko wk** jeśli bym przeglądał sobie jakieś dane (np. skomplikowane zestawienie, które mi się robił przez ostatnią godzinę), które nagle się zaczyna odświeżać.
  2. odświeżanie robi się na życzenie usera (np. dodatkowy guzik)
  3. jeśli chcesz edytować dane w gridzie to masz tzw optimistick lock, który zakłada, że dane w bazie są takie jak te w gridzie i faktyczny stan jest sprawdzany dopiero przy zapisie danych i dopiero tutaj dostaniesz ew. komunikat, że nie można zapisać zmian bo ktoś już to zrobił
  4. jeśli edytujesz np. na osobnej formatce to przed wyświetleniem formatki robisz następujące rzeczy
    a) otwierasz nową transakcję
    b) pobierasz najświeższe dane do edycji
    c) blokujesz rekord(y) przed zmianą ich przez innych.
    Wiele baz pozwala to zrobić jednym zapytaniem - SELECT ... FROM ... FOR UPDATE. Teraz jeśli ktokolwiek spróbuje zrobić takiego selecta to dostanie exception, że rekoed jest już zablokowany
    Teraz wyświetlasz formatkę i po edycji robisz commit lub rollback jeśli user kliknął cancel
0

ReaderWriterLockSlim

To jest klasa ułatwiające czytanie / zapis w wielowątkowych aplikacjach do danych w pamięci .NET. W temacie mowa jest o bazie danych.

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