Optimistická metoda souběžného zpracování: Přehled
LINQ to SQL podporuje optimistické řízení souběžnosti. Následující tabulka popisuje termíny, které platí pro optimistickou souběžnost v dokumentaci LINQ to SQL:
Termíny | Popis |
---|---|
souběžnost | Situace, kdy se dva nebo více uživatelů současně pokusí aktualizovat stejný řádek databáze. |
konflikt souběžnosti | Situace, kdy se dva nebo více uživatelů současně pokusí odeslat konfliktní hodnoty do jednoho nebo více sloupců řádku. |
kontrola souběžnosti | Technika používaná k řešení konfliktů souběžnosti. |
optimistická kontrola souběžnosti | Technika, která nejprve zkoumá, zda jiné transakce změnily hodnoty v řádku před povolením odeslání změn. Kontrast s pesimistickým řízením souběžnosti, který zamkne záznam, aby se zabránilo konfliktům souběžnosti. Optimistická kontrola je tak označená, protože považuje pravděpodobnost, že jedna transakce zasahuje do jiné, není pravděpodobné. |
Konfliktů | Proces aktualizace konfliktní položky opětovným dotazováním databáze a následným vyrovnáním rozdílů. Při aktualizaci objektu obsahuje sledování změn LINQ to SQL následující data: – Hodnoty původně převzaté z databáze a použité pro kontrolu aktualizace. – Nové hodnoty databáze z následného dotazu. LINQ to SQL pak určuje, zda je objekt v konfliktu (to znamená, zda se změnila jedna nebo více hodnot jeho členů). Pokud je objekt v konfliktu, LINQ to SQL další určuje, které jeho členy jsou v konfliktu. Všechny konflikty členů, které LINQ to SQL zjistí, se přidá do seznamu konfliktů. |
V objektovém modelu LINQ to SQL dojde ke konfliktu optimistické souběžnosti, pokud platí obě následující podmínky:
Klient se pokusí odeslat změny do databáze.
Od posledního přečtení klienta se v databázi aktualizovala jedna nebo více hodnot kontroly aktualizací.
Řešení tohoto konfliktu zahrnuje zjištění, které členy objektu jsou v konfliktu, a pak se rozhodnout, co s ním chcete udělat.
Poznámka:
Pouze členové mapovaní jako Always nebo WhenChanged se účastní kontrol optimistické souběžnosti. U členů označených Nevernení provedena žádná kontrola . Další informace najdete na webu UpdateCheck.
Příklad
Například v následujícím scénáři uživatel User1 začne připravovat aktualizaci dotazováním databáze na řádek. Uživatel1 obdrží řádek s hodnotami Alfreds, Maria a Sales.
Uživatel1 chce změnit hodnotu sloupce Manažer na Alfred a hodnotu sloupce Oddělení na Marketing. Než uživatel User1 může tyto změny odeslat, uživatel User2 odeslal změny do databáze. Takže teď se hodnota sloupce Asistent změnila na Mary a hodnotu sloupce Oddělení na Službu.
Když se uživatel User1 nyní pokusí odeslat změny, odeslání selže a ChangeConflictException vyvolá se výjimka. K tomuto výsledku dochází, protože hodnoty databáze pro sloupec Asistent a sloupec Oddělení nejsou ty, které byly očekávány. Členové představující sloupce Asistent a Oddělení jsou v konfliktu. Následující tabulka shrnuje situaci.
Stav | Manažer | Pomocník | Oddělení |
---|---|---|---|
Původní stav | Alfreds | Maria | Prodej |
User1 | Alfred | Marketing | |
User2 | Mary | Služba |
Konflikty můžete vyřešit různými způsoby. Další informace naleznete v tématu Postupy: Správa konfliktů změn.
Kontrolní seznam pro zjišťování konfliktů a řešení konfliktů
Konflikty můžete rozpoznat a vyřešit na libovolné úrovni podrobností. V jednom extrémním případě můžete vyřešit všechny konflikty jedním ze tří způsobů (viz RefreshMode) bez dalšího zvážení. V opačném extrémním případě můžete určit konkrétní akci pro každý typ konfliktu u každého člena, který je v konfliktu.
Určete nebo revidujte UpdateCheck možnosti v objektového modelu.
Další informace naleznete v tématu Postupy: Určení členů testovaných pro konflikty souběžnosti.
V bloku try/catch volání SubmitChangeszadejte, v jakém okamžiku chcete vyvolat výjimky.
Další informace naleznete v tématu Postupy: Určení, kdy jsou vyvolány výjimky souběžnosti.
Určete, kolik podrobností konfliktu chcete načíst, a odpovídajícím způsobem zahrňte kód do bloku try/catch.
Další informace naleznete v tématu Postupy: Načtení informací o konfliktech entit a postupy: Načtení informací o konfliktu členů.
Do kódu zahrňte
try
/catch
, jak chcete vyřešit různé konflikty, které zjistíte.Další informace naleznete v tématu Postupy: Řešení konfliktů zachováním hodnot databáze, Postupy: Řešení konfliktů přepsáním hodnot databáze a postupy: Řešení konfliktů sloučením s hodnotami databáze.
Typy LINQ to SQL, které podporují zjišťování konfliktů a řešení
Třídy a funkce pro podporu řešení konfliktů v optimistické souběžnosti v LINQ to SQL zahrnují následující: