2010-09-17 10 views
6

Sytuacja: wiele front-endów (np. Silverlight, ASP) współdzielących pojedynczy serwer zaplecza (WCF RIA lub inna usługa internetowa).Zapobieganie powielaniu edycji/blokowaniu rekordów DB podczas edycji - jednokrotny serwer zaplecza

Szukam standardu, aby uniemożliwić wielu osobom edytowanie tego samego formularza. Rozumiem, że nie jest to łatwy temat, ale wymagania są wymogami.

Poprzednio użyłem daty ostatniej modyfikacji DB w odniesieniu do przesłanych danych i ostrzegam lub zgłaszam błąd, jeśli dane zostały zmodyfikowane od momentu załadowania. Początkowy system po prostu przesłaniał dane bez ostrzeżenia. Problem polega na tym, że mam nowy wymóg, aby zapobiec obu tym sytuacjom. Będzie wiele interfejsów użytkownika, więc system blokowania może stanowić wyzwanie i oczywiście nie ma gwarancji, że klient nie zamknie okna/przeglądarki w trakcie edycji.

Byłbym wdzięczny za każdą pomoc.

+0

Nie jestem pewien, czy podążam. Szukasz pesymistycznego systemu zamków, który uniemożliwia użytkownikowi edycję czegoś, co według niego jest już w trakcie edycji? ALBO czy szukasz czegoś optymistycznego, co pozwala na wielokrotną edycję, ale odrzuca zgłoszenia po zmianie danych? – AnthonyWJones

+0

Pesymistyczny scenariusz blokowania jest zbyt ograniczony, więc podrapuję ten pomysł.Nie chcę, aby użytkownicy edytowali przez 30 minut, aby odrzucić zmiany, gdy ktoś inny pobije ich do przesłania zmiany. –

+0

Jednak optymistyczny scenariusz łączenia wymaga wiele dodatkowej pracy z mojej strony, ponieważ potrzebuję narzędzia, które umożliwiłoby klientowi scalenie właściwości publicznych obiektów, prawdopodobnie w sposób podobny do siatki. –

Odpowiedz

8

Jeśli mam rację, wygląda na to, że mówisz o formie przeprawy typu check-out/edit/check-in. Jeśli jeden użytkownik edytuje rekord, żaden inny użytkownik nie może rozpocząć edycji tego samego rekordu.

To jest forma pesymistycznej współbieżności. Wiele frameworków dostępu do sieci i danych obsługuje (podobną) współbieżność optymalizującą - to znaczy, że powiedzą ci, że ktoś inny już zmienił rekord, gdy próbowałeś zapisać. Optymistycznie nie ma pojęcia o blokowaniu - zapewnia, że ​​żaden inny użytkownik nie będzie zapisywał między czasem pobrania a czasem zapisania.

To, czego oczekujesz, nie jest łatwym wymogiem w Internecie, ponieważ serwer naprawdę nie ma możliwości wymuszenia zameldowania, gdy użytkownik przerwie edycję (na przykład zamykając przeglądarkę). Nie znam żadnych frameworków, które radzą sobie z tym w ogóle.

Zasadniczo potrzebne jest posiadanie informacji o kasie na serwerze. Proces użytkownika podczas edycji wymagałby zamówienia, a serwer udzieliłby/odmówiłby tego na podstawie tego, co sprawdzał. Serwer musiałby również przechowywać informacje o tym, że zasób jest wyrejestrowany. Kiedy użytkownik zapisuje serwer, zwalnia blokadę i pozwala na nowe zamówienie na żądanie. Problem pojawia się, gdy użytkownik przerwie edycję - jeśli jest to przez interfejs użytkownika, nie ma problemu ... po prostu powiedz serwerowi, aby zwolnił blokadę.

Ale jeśli to przez zamknięcie przeglądarki, wyłączenie maszyny, itp. Masz osieroconą blokadę. Większość ludzi rozwiązuje ten jeden z dwóch sposobów: 1. Limit czasu. Blokada zostanie ostatecznie zwolniona. Plusem jest to, że jest dość łatwy i niezawodny. Wadą jest to, że rekord jest zablokowany na jakiś czas, gdzie nie jest on w rzeczywistości edytowany. Musi też upłynąć wystarczająco dużo czasu, aby zaoszczędzić użytkownikowi, który naprawdę długo nie zapisał błędu, ponieważ czas blokady minął (i muszą zacząć od nowa). 2. Bicie serca. Użytkownik regularnie wysyła polecenie ping do serwera, aby powiedzieć "tak, nadal edytuj". Jest to w zasadzie opcja limitu czasu z # 1, ale z naprawdę krótkim czasem oczekiwania, który można odświeżać na żądanie. Plusem jest to, że możesz zrobić dowolnie krótko. Minusem jest zwiększona złożoność i wykorzystanie sieci.

Tokeny checkin/checkout naprawdę nie są trudne do wdrożenia, jeśli masz już przetransaktywowany, trwały sklep (jak DB): trudnym elementem jest zintegrowanie go z wygodą użytkownika.

+0

Ból głowy! Dlaczego mimo to potrzebuję więcej niż jednego użytkownika? : -/ –

+0

Ale tak, to jest pomiędzy pesymistyczną i optymistyczną współbieżnością. Chociaż wolę optymistyczne podejście, może potencjalnie wymagać dużo pracy (zobacz mój komentarz w głównym poście). Twoja pesymistyczna opcja bicia serca brzmi najbezpieczniej, ale muszę zdecydować, czy (brzydkie) kompromisy są tego warte. –

+0

+1 każdy, dobre pytania i odpowiedzi. Zasadniczo potwierdziłem to, o czym myślałem ... nie myślałem o biciu serca. –

Powiązane problemy