Sdílet prostřednictvím


Optimistická souběžnost: 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:

Podmínky Popis
konkurentnost 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.
řízení souběžnosti Technika používaná ke zvládnutí 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.

Na rozdíl od pesimistického řízení souběžnosti, který zamkne záznam, aby se zabránilo konfliktům souběžnosti.

Optimistická kontrola je tak nazývána, protože se považuje za nepravděpodobné, že by jedna transakce zasahovala do jiné.
Řešení 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 doby, kdy klient naposledy přečetl hodnoty pro kontrolu aktualizací, byly v databázi aktualizovány jedna nebo více těchto hodnot.

Ř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 v tématu 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. Hodnota ve sloupci Asistent byla tedy změněna na Mary a hodnota ve sloupci Oddělení na Služby.

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é, kteří zastupují sloupce Asistent a Oddělení, jsou v konfliktu. Následující tabulka shrnuje situaci.

Stát Manažer Pomocník Oddělení
Původní stav Alfreds Měsíční moře Prodej
Uživatel1 Alfréd 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é