Sdílet prostřednictvím


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.

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í:

Viz také