Udostępnij za pośrednictwem


Optymistyczna współbieżność: Omówienie

LinQ to SQL obsługuje optymistyczną kontrolę współbieżności. W poniższej tabeli opisano terminy dotyczące optymistycznej współbieżności w dokumentacji LINQ to SQL:

Terminy opis
współbieżność Sytuacja, w której co najmniej dwóch użytkowników jednocześnie próbuje zaktualizować ten sam wiersz bazy danych.
Konflikt współbieżności Sytuacja, w której co najmniej dwóch użytkowników jednocześnie próbuje przesłać wartości powodujące konflikt do co najmniej jednej kolumny wiersza.
formant współbieżności Technika używana do rozwiązywania konfliktów współbieżności.
optymistyczna kontrola współbieżności Technika, która najpierw bada, czy inne transakcje zmieniły wartości w wierszu przed zezwoleniem na przesłania zmian.

Kontrast z pesymistyczną kontrolką współbieżności, która blokuje rekord, aby uniknąć konfliktów współbieżności.

Optymistyczna kontrola jest tak określana, ponieważ uważa, że szanse jednej transakcji zakłócają drugą na mało prawdopodobne.
Konfliktów Proces odświeżania elementu powodującego konflikt przez ponowne wykonywanie zapytań względem bazy danych, a następnie uzgadnianie różnic.

Po odświeżeniu obiektu monitor zmian LINQ to SQL przechowuje następujące dane:

— wartości pochodzące z bazy danych i używane do sprawdzania aktualizacji.
- Nowe wartości bazy danych z kolejnej kwerendy.

LINQ to SQL określa następnie, czy obiekt jest w konflikcie (czyli czy co najmniej jedna z jego wartości członkowskich uległa zmianie). Jeśli obiekt jest w konflikcie, LINQ to SQL następnie określa, które z jego elementów członkowskich są w konflikcie.

Każdy konflikt elementu członkowskiego, który odnajduje LINQ to SQL, jest dodawany do listy konfliktów.

W modelu obiektów LINQ to SQL występuje optymistyczny konflikt współbieżności, gdy oba następujące warunki są spełnione:

  • Klient próbuje przesłać zmiany do bazy danych.

  • Co najmniej jedna wartość sprawdzania aktualizacji została zaktualizowana w bazie danych od czasu ostatniego odczytania ich przez klienta.

Rozwiązanie tego konfliktu obejmuje wykrycie, które elementy członkowskie obiektu są w konflikcie, a następnie podjęcie decyzji o tym, co chcesz zrobić.

Uwaga

Tylko członkowie mapowane jako Always lub WhenChanged uczestniczą w optymistycznych kontrolach współbieżności. Nie wykonano sprawdzania dla elementów członkowskich oznaczonych jako Never. Aby uzyskać więcej informacji, zobacz UpdateCheck.

Przykład

Na przykład w poniższym scenariuszu użytkownik User1 rozpoczyna przygotowywanie aktualizacji, wysyłając zapytanie do bazy danych dla wiersza. Użytkownik User1 otrzymuje wiersz z wartościami Alfreds, Maria i Sales.

Użytkownik1 chce zmienić wartość kolumny Menedżer na Alfred i wartość kolumny Dział na Marketing. Zanim użytkownik User1 będzie mógł przesłać te zmiany, użytkownik User2 przesłał zmiany do bazy danych. Teraz wartość kolumny Asystent została zmieniona na Mary i wartość kolumny Department (Dział) na Service (Usługa).

Gdy użytkownik User1 próbuje teraz przesłać zmiany, przesyłanie kończy się niepowodzeniem i zgłaszany ChangeConflictException jest wyjątek. Ten wynik występuje, ponieważ wartości bazy danych dla kolumny Asystent i kolumny Dział nie są tymi, które były oczekiwane. Członkowie reprezentujący kolumny Asystent i Dział są w konflikcie. Poniższa tabela zawiera podsumowanie sytuacji.

Stan Menedżer Asystent Department
Stan oryginalny Alfreds Maria Sprzedaż
User1 Alfred Marketing
Użytkownik2 Mary Usługa

Konflikty takie jak te można rozwiązać na różne sposoby. Aby uzyskać więcej informacji, zobacz How to: Manage Change Conflicts (Jak zarządzać konfliktami zmian).

Lista kontrolna wykrywania konfliktów i rozwiązywania problemów

Możesz wykrywać i rozwiązywać konflikty na dowolnym poziomie szczegółowości. W jednej skrajności można rozwiązać wszystkie konflikty na jeden z trzech sposobów (zobacz RefreshMode) bez dodatkowej uwagi. W drugiej skrajności można wyznaczyć określoną akcję dla każdego typu konfliktu na każdym elemencie członkowskim w konflikcie.

LINQ to SQL Types That Support Conflict Discovery and Resolution

Klasy i funkcje do obsługi rozwiązywania konfliktów w optymistycznej współbieżności w LINQ to SQL obejmują następujące elementy:

Zobacz też