Zpracování selhání potvrzení transakcí

Poznámka

EF6.1 Pouze – funkce, rozhraní API atd. probírané na této stránce byly představeny v Entity Frameworku 6.1. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.

V rámci verze 6.1 zavádíme novou funkci odolnosti připojení pro EF: schopnost automaticky zjišťovat a obnovovat v případě přechodných selhání připojení vliv na potvrzení potvrzení transakcí. Úplné podrobnosti o scénáři jsou nejlépe popsány v blogovém příspěvku SQL Database Připojení ivity a idempotentní problém. Scénář je v souhrnu takový, že pokud je během potvrzení transakce vyvolána výjimka, existují dvě možné příčiny:

  1. Potvrzení transakce se na serveru nezdařilo.
  2. Potvrzení transakce bylo na serveru úspěšné, ale problém s připojením zabránil oznámení o úspěchu v dosažení klienta.

Když nastane první situace, aplikace nebo uživatel může operaci zopakovat, ale když dojde k druhé situaci, je třeba se vyhnout opakování a aplikace se může automaticky obnovit. Výzvou je, že bez možnosti zjistit, co bylo skutečným důvodem nahlášení výjimky během potvrzení, nemůže aplikace zvolit správný průběh akce. Nová funkce EF 6.1 umožňuje EF pečlivě zkontrolovat databázi, pokud transakce proběhla úspěšně, a transparentně provést správný postup.

Použití funkce

Chcete-li povolit funkci, je třeba zahrnout volání SetTransactionHandler v konstruktoru dbConfiguration. Pokud se službou DbConfiguration neznáte, přečtěte si téma Konfigurace založená na kódu. Tuto funkci lze použít v kombinaci s automatickými opakováními, které jsme zavedli v EF6, což pomáhá v situaci, kdy transakce skutečně selhala potvrzení na serveru kvůli přechodnému selhání:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;

public class MyConfiguration : DbConfiguration  
{
  public MyConfiguration()  
  {  
    SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());  
    SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());  
  }  
}

Způsob sledování transakcí

Když je tato funkce povolená, ef automaticky přidá do databáze novou tabulku s názvem __Transactions. Nový řádek se vloží do této tabulky při každém vytvoření transakce ef a tento řádek se zkontroluje existence, pokud dojde k selhání transakce během potvrzení.

I když ef udělá co největší úsilí při vyřazení řádků z tabulky, když už nejsou potřeba, může se tabulka zvětšit, pokud se aplikace předčasně ukončí a z tohoto důvodu možná budete muset tabulku v některých případech ručně vyprázdnit.

Zpracování selhání potvrzení s předchozími verzemi

Před EF 6.1 nebyl žádný mechanismus pro zpracování selhání potvrzení v produktu EF. Existuje několik způsobů, jak tuto situaci vyřešit, které lze použít v předchozích verzích EF6:

  • Možnost 1 – Nic nedělejte

    Pravděpodobnost selhání připojení během potvrzení transakce je nízká, takže může být přijatelné, aby vaše aplikace mohla pouze selhat, pokud k této podmínce skutečně dojde.

  • Možnost 2 – Použití databáze k resetování stavu

    1. Zahodit aktuální DbContext
    2. Vytvořte nový DbContext a obnovte stav aplikace z databáze.
    3. Informujte uživatele, že poslední operace pravděpodobně nebyla úspěšně dokončena.
  • Možnost 3 – Ruční sledování transakce

    1. Do databáze, která se používá ke sledování stavu transakcí, přidejte nesledovanou tabulku.
    2. Vložte řádek do tabulky na začátku každé transakce.
    3. Pokud se připojení během potvrzení nezdaří, zkontrolujte přítomnost odpovídajícího řádku v databázi.
      • Pokud je řádek k dispozici, pokračujte normálně, protože transakce byla úspěšně potvrzena.
      • Pokud řádek chybí, použijte strategii provádění k opakování aktuální operace.
    4. Pokud je potvrzení úspěšné, odstraňte odpovídající řádek, abyste se vyhnuli růstu tabulky.

Tento blogový příspěvek obsahuje ukázkový kód pro tento účel v SQL Azure.