Sdílet prostřednictvím


Optimalizace pomocí jednofázového potvrzení a oznámení o jedné fázi

Toto téma popisuje mechanismy poskytované infrastrukturou System.Transactions pro optimalizaci výkonu.

Nábor v jedné fázi s možností povýšení

Infrastruktura System.Transactions spravuje transakci uvnitř jedné domény aplikace, která zahrnuje maximálně jeden trvalý prostředek nebo více nestálých prostředků. System.Transactions Vzhledem k tomu, že infrastruktura využívá pouze volání domény uvnitř aplikace, poskytuje nejlepší propustnost a výkon.

Pokud je však transakce poskytována jinému objektu v jiné aplikační doméně (včetně přes hranice procesů a počítačů) na stejném počítači, nebo pokud byste zapsali jiného správce trvalých prostředků, System.Transactions infrastruktura automaticky eskaluje transakci, aby byla spravována MSDTC. Transakce spravovaná pomocí MSDTC není tak výkonná jako jedna spravovaná infrastrukturou System.Transactions .

Pro optimalizaci výkonu System.Transactions poskytuje infrastruktura propagační jednofázové zařazení (PSPE), která umožňuje jeden vzdálený trvalý prostředek umístěný v jiné doméně aplikace, procesu nebo počítači, účastnit System.Transactions transakce, aniž by to způsobilo eskalaci na transakci MSDTC. Tento správce prostředků (RM) může hostovat a "vlastnit" transakci, která může být později eskalována na distribuovanou transakci (nebo transakce MSDTC) v případě potřeby. Tím se snižuje pravděpodobnost použití msDTC.

Tento konkrétní správce prostředků má obvykle své vlastní interní nedistribuované transakce a musí podporovat převod těchto transakcí na distribuované transakce během spuštění. Například SQL Server 2005 je takový správce prostředků. V takovém případě System.Transactions infrastruktura zaujme pasivní roli tím, že bude pouze monitorovat transakci a zjišťovat, zda je potřeba eskalace. Aby byla podpořena interakce mezi infrastrukturou a správcem System.Transactions prostředků, je třeba, aby tento správce implementoval rozhraní IPromotableSinglePhaseNotification.

Metoda EnlistPromotableSinglePhase se používá k zařazení jednoho trvalého prostředku, který lze později eskalovat. Tato metoda zajišťuje, že zařazení lze eskalovat podle potřeby. Pokud zařazení proběhne úspěšně, RM vytvoří svou interní transakci a přidruží ji k System.Transactions transakci. Pokud zařazení PSPE selže, RM by měl místo toho použít metodu EnlistDurable pro zařazení. K selhání při zařazení do PSPE může dojít, pokud už je transakce distribuovaná, nebo pokud už jiný manažer zdrojů provedl zařazení do PSPE.

Po zařazení jsou volání klientů o potvrzení nebo přerušení System.Transactions transakce převedena na volání Správce zdrojů, a to vyvoláním metody SinglePhaseCommit nebo Rollback, každé odpovídající konkrétnímu úkonu.

System.Transactions Pokud transakce nikdy nevyžaduje eskalaci, při potvrzení transakce obdrží RM SinglePhaseCommit oznámení. Pak může potvrdit interní transakci, která byla původně vytvořena.

System.Transactions Pokud je potřeba transakci eskalovat (např. kvůli podpoře více RM), System.Transactions informuje správce prostředků voláním Promote metody v ITransactionPromoter rozhraní, ze kterého IPromotableSinglePhaseNotification rozhraní je odvozeno. Správce prostředků pak převede transakci interně z místní transakce (která nevyžaduje protokolování) na objekt transakce, který je schopen účastnit se transakce DTC a přidruží ji k již provedené práci. Když je transakce požádána o potvrzení, správce transakcí stále odešle SinglePhaseCommit oznámení správci prostředků, který potvrdí distribuovanou transakci, kterou vytvořila během eskalace.

Poznámka:

Trasování TransactionCommitted, které jsou generovány, když je vyvoláno potvrzení na eskalovanou transakci, obsahují ID aktivity transakce DTC.

Další informace o eskalaci správy naleznete v tématu Eskalace správy transakcí.

Scénář eskalace správy transakcí

Následující scénář ukazuje eskalaci distribuované transakce pomocí System.Data oboru názvů jako proxy pro správce prostředků. Tento scénář předpokládá, že již existuje jedno System.Data připojení k databázi, CN1, zapojené do transakce a aplikace chce zahrnovat další System.Data připojení CN2. Transakce musí být eskalována do DTC jako plně distribuovaná dvoufázová potvrzovací transakce.

V tomto scénáři:

  1. CN1 volá metodu EnlistPromotableSinglePhase pro zařazení do transakce. Transakce je stále místní a neexistují žádné další propagační zařazení na transakci, takže EnlistPromotableSinglePhase volání bude úspěšné.

  2. Když druhé připojení, CN2, volá EnlistPromotableSinglePhase, volání selže, protože existuje další propagovatelný zápis. Z tohoto důvodu musí CN2 získat tu DTC transakci, aby ji bylo možné předat SQL. K tomu používá jednu z metod poskytovaných TransactionInterop třídou k vytvoření formátu transakce, který lze poskytnout SQL.

  3. System.Transactions volá metodu Promote v ITransactionPromoter rozhraní implementovaném CN1.

  4. V tomto okamžiku CN1 eskaluje transakci pomocí určitého mechanismu specifického pro SQL 2005 a System.Data.

  5. Návratová hodnota z Promote metody je bajtové pole, které obsahuje token šíření pro transakci. System.Transactions pomocí tohoto tokenu šíření vytvoří transakci DTC, kterou může začlenit do místní transakce.

  6. V tomto okamžiku může CN2 použít data přijatá z volání jedné z metod pomocí TransactionInterop k předání transakce do SQL.

  7. Nyní jsou oba zařazeny do distribuované transakce DTC.

Optimalizace jednofázového potvrzení

Protokol jednofázového potvrzení je efektivnější za běhu, protože všechny aktualizace se provádějí bez explicitní koordinace. Pokud chcete tuto optimalizaci využít, měli byste implementovat manažer prostředků pomocí ISinglePhaseNotification rozhraní pro prostředek a zapojit se do transakce pomocí metod EnlistDurable nebo EnlistVolatile. Konkrétně by se měl parametr EnlistmentOptions rovnat None , aby se zajistilo, že se provede jednofázové potvrzení.

Vzhledem k tomu, že ISinglePhaseNotification rozhraní je odvozeno z IEnlistmentNotification rozhraní, pokud váš RM nemá nárok na jednofázové potvrzení, může stále přijímat oznámení o dvoufázovém potvrzení. Pokud váš RM obdrží SinglePhaseCommit oznámení od TM, měl by se pokusit vykonat práci potřebnou k tomu, aby mohla být transakce potvrzena, a podle toho informovat správce transakcí, zda má být transakce potvrzena nebo vrácena zpět, a to voláním metody Committed, Aborted nebo InDoubt na parametr SinglePhaseEnlistment. Odpověď Done na zařazení v této fázi znamená sémantiku pouze pro čtení. Proto byste neměli odpovídat Done kromě žádné z dalších metod.

Pokud existuje pouze jedno nestálé zařazení a žádné trvalé zařazení, nestálé zařazení obdrží oznámení SPC. Pokud existují nějaké nestálé účasti a pouze jedna trvalá účast, nestálé účasti obdrží 2PC. Po dokončení trvalého zařazení obdrží SPC.

Viz také