Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Určete nebo revidujte UpdateCheck možnosti v objektovém modelu.
Další informace naleznete v tématu Postupy: Jak určit, které členy se testují na konflikty souběžnosti.
V bloku try/catch při volání SubmitChanges zadejte, v jakém okamžiku chcete, aby byly výjimky vyvolány.
Další informace naleznete v tématu Postupy: Jak určit, kdy se vyvolávají 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í: