sql >> Databáze >  >> RDS >> Mysql

Atomic Increment with Entity Framework

S Entity Framework z toho nemůžete udělat "atomickou" operaci. Máte kroky:

  1. Načíst entitu z databáze
  2. Počítadlo změn v paměti
  3. Uložit změněnou entitu do databáze

Mezi těmito kroky může jiný klient načíst entitu z databáze, která má stále starou hodnotu.

Nejlepší způsob, jak se s touto situací vypořádat, je použít optimistický souběh . V zásadě to znamená, že změna v kroku 3 se neuloží, pokud počítadlo již není stejné, jako když jste načetli entitu v kroku 1. Místo toho získáte výjimku, kterou můžete zpracovat znovu načtením entity a znovu použít změnu.

Pracovní postup by vypadal takto:

  • V Work entita WordCount vlastnost musí být označena jako souběžný token (anotace nebo Fluent API v případě Code-First)
  • Načíst entitu z databáze
  • Počítadlo změn v paměti
  • Zavolejte SaveChanges v try-catch blokovat a zachytávat výjimky typu DbUpdateConcurrencyException
  • Pokud dojde k výjimce, znovu načtěte entitu v catch blok z databáze, aplikujte změnu znovu a zavolejte SaveChanges znovu
  • Opakujte poslední krok, dokud již nedojde k žádné výjimce

V této odpovědi můžete najít příklad kódu pro tento postup (pomocí DbContext ).



  1. Jak vytvořit tabulku s cizím klíčem v SQL

  2. Jak zjistit, zda používáte SSL v připojení MySql?

  3. Jaká je alternativa klauzule LIMIT v JPQL?

  4. Přidání dat do databáze Cloud Firestore