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.
Określ lub popraw UpdateCheck opcje w modelu obiektów.
Aby uzyskać więcej informacji, zobacz Jak określić, które elementy członkowskie są testowane pod kątem konfliktów współbieżności.
W bloku try/catch wywołania metody SubmitChanges, określ, w jakim momencie mają zostać zgłoszone wyjątki.
Aby uzyskać więcej informacji, zobacz How to: Specify When Concurrency Exceptions are Thrown (Instrukcje: określanie, kiedy wyjątki współbieżności są zgłaszane).
Określ, ile szczegółów konfliktu chcesz pobrać, i dołącz kod do bloku try/catch odpowiednio.
Aby uzyskać więcej informacji, zobacz How to: Retrieve Entity Conflict Information (Instrukcje: pobieranie informacji o konflikcie jednostki) i How to: Retrieve Member Conflict Information (Jak pobrać informacje o konflikcie jednostki).
Uwzględnij w
try
/catch
kodzie sposób rozwiązywania różnych wykrytych konfliktów.Aby uzyskać więcej informacji, zobacz How to: Resolve Conflicts by Retaining Database Values (Jak rozwiązywać konflikty przez zastępowanie wartości bazy danych) i How to: Resolve Conflicts by Scale with Database Values (Jak rozwiązywać konflikty przez scalanie wartości bazy danych).
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: