Programovanie

Ako riešiť konflikty súbežnosti v Entity Framework

Spracovanie súbežnosti možno použiť na udržanie integrity a konzistencie údajov, keď k rovnakému prostriedku pristupuje viac používateľov súčasne. Porušenie súbežnosti môže nastať, keď máte vzájomne závislé transakcie, t. J. Transakcie, ktoré sú navzájom závislé a pokúšate sa získať prístup k rovnakému prostriedku.

Riešenie konfliktov súbežnosti v Entity Framework

Poďme si teraz predstaviť, ako každá z týchto stratégií funguje v Entity Framework. V pesimistickej súbežnosti, keď sa aktualizuje konkrétny záznam, všetky ostatné súbežné aktualizácie toho istého záznamu sa pozastavia, kým sa nedokončí aktuálna operácia a ovládací prvok sa nevzdá späť, aby mohli pokračovať ďalšie súbežné operácie. V optimistickom režime súbežnosti „vyhráva“ posledný uložený záznam. V tomto režime sa predpokladá, že konflikty zdrojov v dôsledku súbežných prístupov k zdieľanému prostriedku sú nepravdepodobné, ale nie nemožné.

Mimochodom, Entity Framework predvolene poskytuje podporu pre optimistickú súbežnosť. Entity Framework neposkytuje podporu pre pesimistickú súbežnosť. Poďme teraz pochopiť, ako Entity Framework rieši konflikty súbežnosti pri práci v optimistickej súbežnosti (predvolený režim).

Pri práci s optimistickým režimom spracovania súbežnosti by ste zvyčajne chceli uložiť údaje do svojej databázy za predpokladu, že sa údaje nezmenili od ich načítania do pamäte. Upozorňujeme, že pri pokuse o uloženie zmien do databázy pomocou metódy SaveChanges v inštancii kontextu údajov bude vyvolaná výnimka DbUpdateConcurrencyException. Poďme teraz pochopiť, ako to môžeme napraviť.

Ak chcete skontrolovať porušenie súbežnosti, môžete do svojej triedy entít zahrnúť pole a označiť ho pomocou atribútu Časová pečiatka. Pozri triedu entít uvedenú nižšie.

verejná trieda Autor

   {

public Int32 Id {get; sada; }

verejný reťazec FirstName {get; sada; }

verejný reťazec Priezvisko {get; sada; }

public string Adresa {get; sada; }

[Časová značka]

public byte [] RowVersion {get; sada; }

   }

Teraz Entity Framework podporuje dva režimy súbežnosti: Žiadny a Opravený. Zatiaľ čo prvý znamená, že sa pri aktualizácii entity nebudú vykonávať kontroly súbežnosti, druhý znamená, že pôvodná hodnota vlastnosti sa bude brať do úvahy pri vykonávaní klauzúl WHERE v čase, keď sa vykonávajú aktualizácie alebo mazania údajov. Ak máte vlastnosť, ktorá je označená pomocou časovej pečiatky, režim súbežnosti sa považuje za pevný, čo zase znamená, že pôvodná hodnota vlastnosti by sa zohľadňovala v klauzule WHERE akýchkoľvek aktualizácií alebo vymazaní údajov pre konkrétnu entitu.

Ak chcete vyriešiť optimistické konflikty súbežnosti, môžete využiť metódu Reload na aktualizáciu aktuálnych hodnôt vo vašej entite nachádzajúcich sa v pamäti o posledné hodnoty v databáze. Po opätovnom načítaní aktualizovaných údajov sa môžete pokúsiť znova uchovať svoju entitu v databáze. Nasledujúci úryvok kódu ilustruje, ako je to možné dosiahnuť.

pomocou (var dbContext = nový IDBDataContext ())

{

Autor autor = dbContext.Authors.Find (12);

author.Address = "Hyderabad, Telengana, INDIA";

skús

         {

dbContext.SaveChanges ();

         }

catch (DbUpdateConcurrencyException ex)

         {

napr. Entries.Single (). Reload ();

dbContext.SaveChanges ();

         }

}

Všimnite si, že môžete využiť metódu Entries na inštancii DbUpdateConcurrencyException na načítanie zoznamu inštancií DbEntityEntry zodpovedajúcich entitám, ktoré sa nedali aktualizovať, keď sa volala metóda SaveChanges, aby sa entity uchovali v databáze.

Prístup, o ktorom sme práve hovorili, sa teraz často nazýva „uložené výhry“ alebo „výhry databázy“, pretože údaje obsiahnuté v entite sú prepísané údajmi dostupnými v databáze. Môžete tiež použiť iný prístup s názvom „klient vyhráva“. V tejto stratégii sa údaje z databázy získavajú na vyplnenie entity. V zásade sú údaje získané z podkladovej databázy nastavené ako pôvodné hodnoty pre entitu. Nasledujúci úryvok kódu ilustruje, ako je to možné dosiahnuť.

skús

{

dbContext.SaveChanges ();

}

catch (DbUpdateConcurrencyException ex)

{

var data = napr. Entries.Single ();

data.OriginalValues.SetValues ​​(data.GetDatabaseValues ​​());

}

Môžete tiež skontrolovať, či entita, ktorú sa pokúšate aktualizovať, už bola odstránená iným používateľom alebo už bola aktualizovaná iným používateľom. Nasledujúci úryvok kódu ilustruje, ako to môžete urobiť.

catch (DbUpdateConcurrencyException ex)

{

var entity = ex.Entries.Single (). GetDatabaseValues ​​();

if (entity == null)

   {

Console.WriteLine ("Aktualizovaná entita je už odstránená iným používateľom ...");

   }

inak

   {

Console.WriteLine ("Aktualizovaná entita už bola aktualizovaná iným používateľom ...");

   }

}

Ak vaša databázová tabuľka nemá stĺpec časovej pečiatky alebo verziu riadku, môžete využiť atribút ConcurrencyCheck na zistenie konfliktov súbežnosti pri použití Entity Framework. Tu je príklad, ako sa táto vlastnosť používa.

[Tabuľka („Autori“)

verejná trieda Autor

{

verejný autor () {}

[Kľúč]

public int Id {get; sada; }

[Kontrola súbežnosti]

verejný reťazec FirstName {get; sada; }

verejný reťazec Priezvisko {get; sada; }

public string Adresa {get; sada; }

}

Ak to urobíte, SQL Server by automaticky zahrnul AuthorName pri vykonávaní aktualizácií alebo mazaní príkazov v databáze.

$config[zx-auto] not found$config[zx-overlay] not found