Delen via


Optimalisatie met single-phase commit en promotable single-phase-notification

In dit onderwerp worden de mechanismen beschreven die door de infrastructuur worden geleverd om de System.Transactions prestaties te optimaliseren.

Promoveerbare Enkelvoudige Fase Aanstelling

De System.Transactions infrastructuur beheert een transactie binnen één toepassingsdomein dat maximaal één duurzame resource of meerdere vluchtige resources omvat. Omdat de System.Transactions infrastructuur alleen aanroepen binnen het toepassingsdomein gebruikt, levert dit de beste doorvoer en prestaties op.

Als de transactie echter wordt verstrekt aan een ander object in een ander toepassingsdomein (inclusief proces- en computergrenzen) op dezelfde computer, of als u een andere duurzame resourcemanager zou inschakelen, escaleert de System.Transactions infrastructuur de transactie automatisch die wordt beheerd door de MSDTC. Een transactie die wordt beheerd door MSDTC, is niet zo prestatiegericht als een transactie die wordt beheerd door de System.Transactions infrastructuur.

Om de prestaties te optimaliseren, biedt de System.Transactions infrastructuur de Promotable Single Phase Enlistment (PSPE) waarmee één externe duurzame resource, die zich in een ander toepassingsdomein, proces of computer bevindt, kan deelnemen aan een System.Transactions transactie zonder dat deze wordt geëscaleerd naar een MSDTC-transactie. Deze Resource Manager (RM) kan een transactie hosten en 'bezitten' die later kan worden geëscaleerd naar een gedistribueerde transactie (of MSDTC-transactie) indien nodig. Dit vermindert de kans op het gebruik van de MSDTC.

Deze specifieke resourcemanager heeft meestal zijn eigen interne niet-gedistribueerde transacties en moet ondersteuning bieden voor het converteren van deze transacties naar gedistribueerde transacties tijdens runtime. SQL Server 2005 is bijvoorbeeld een dergelijke resourcemanager. In dat geval neemt de System.Transactions infrastructuur een passieve beheerrol door alleen de transactie te controleren op een behoefte aan escalatie. Ter ondersteuning van de interactie tussen de System.Transactions infrastructuur en resourcemanager moet de laatste de interface IPromotableSinglePhaseNotificationimplementeren.

De EnlistPromotableSinglePhase methode wordt gebruikt om één duurzame resource in te schakelen die later kan worden geëscaleerd. Deze methode zorgt ervoor dat de opname naar behoefte kan worden geëscaleerd. Als de aanmelding slaagt, maakt de RM zijn interne transactie aan en koppelt deze aan de System.Transactions transactie. Als de PSPE-opname mislukt, moet de RM in plaats daarvan de EnlistDurable methode gebruiken. Fouten bij het insluiten in PSPE kunnen optreden wanneer de transactie al een gedistribueerde transactie is of wanneer een andere RM al een PSPE-aanhaling heeft uitgevoerd

Zodra deze zijn opgenomen, worden oproepen door cliënten om de transactie System.Transactions door te voeren of af te breken geconverteerd naar oproepen bij de Resource Manager door de methode SinglePhaseCommit aan te roepen, of respectievelijk de Rollback.

Als de System.Transactions transactie nooit escalatie vereist, ontvangt de RM een SinglePhaseCommit melding wanneer de transactie wordt doorgevoerd. Vervolgens kan de oorspronkelijk gecreëerde interne transactie worden doorgevoerd.

Als de System.Transactions transactie moet worden geëscaleerd (bijvoorbeeld ter ondersteuning van meerdere RMs), informeert System.Transactions de resourcemanager door de Promote-methode op de ITransactionPromoter-interface aan te roepen, waarvan de IPromotableSinglePhaseNotification-interface is afgeleid. De resourcemanager converteert de transactie vervolgens intern vanuit een lokale transactie (waarvoor geen logboekregistratie vereist is) naar een transactieobject dat kan deelnemen aan een DTC-transactie en koppelt deze aan het werk dat al is uitgevoerd. Wanneer de transactie wordt gevraagd om door te voeren, verzendt de transactiebeheerder nog steeds de SinglePhaseCommit melding naar de resourcemanager, die de gedistribueerde transactie doorvoert die tijdens escalatie is gemaakt.

Opmerking

De TransactionCommitted traceringen (die worden gegenereerd wanneer een Commit wordt aangeroepen op de geëscaleerde transactie) bevatten de activiteit-ID van de DTC-transactie.

Zie Escalatie van transactiebeheer voor meer informatie over escalatie van beheer.

Escalatiescenario voor transactiebeheer

In het volgende scenario ziet u een escalatie naar een gedistribueerde transactie met behulp van de System.Data naamruimte als de proxy voor de resourcemanager. In dit scenario wordt ervan uitgegaan dat er al één System.Data verbinding is met de database, CN1, betrokken bij de transactie en dat de toepassing een andere System.Data verbinding, CN2, wil betrekken. De transactie moet worden geëscaleerd naar DTC, als een volledige gedistribueerde doorvoertransactie in twee fasen.

In dit scenario,

  1. CN1 roept de EnlistPromotableSinglePhase methode aan om de transactie in te schakelen. Vervolgens is de transactie nog steeds lokaal en er zijn geen andere promootbare inschrijvingen voor de transactie, dus de EnlistPromotableSinglePhase aanroep slaagt.

  2. Wanneer de tweede verbinding CN2 oproept EnlistPromotableSinglePhase, mislukt de oproep omdat er nog een promoteerbare deelneming betrokken is. Daarom moet CN2 een DTC-transactie ophalen om deze door te geven aan SQL. Hiervoor wordt een van de methoden van de TransactionInterop klasse gebruikt om een indeling te produceren van de transactie die aan SQL kan worden gegeven.

  3. System.Transactions roept de Promote methode aan op de ITransactionPromoter interface die door CN1 is geïmplementeerd.

  4. Op dit moment escaleert CN1 de transactie met behulp van een mechanisme dat specifiek is voor SQL 2005 en System.Data.

  5. De retourwaarde van de Promote methode is een bytematrix die een doorgiftetoken voor de transactie bevat. System.Transactions gebruikt dit doorgiftetoken om een DTC-transactie te maken die kan worden opgenomen in de lokale transactie.

  6. Op dit moment kan CN2 de gegevens gebruiken die zijn ontvangen van het aanroepen van een van de methoden door TransactionInterop de transactie door te geven aan SQL.

  7. Beide worden nu opgenomen in een gedistribueerde DTC-transactie.

Single fase commit-optimisatie

Het protocol Single Phase Commit is efficiënter tijdens runtime, omdat alle updates worden uitgevoerd zonder expliciete coördinatie. Als u wilt profiteren van deze optimalisatie, moet u een resourcemanager implementeren met de ISinglePhaseNotification interface voor de resource en deelnemen aan een transactie door gebruik te maken van de EnlistDurable of EnlistVolatile methode. De parameter EnlistmentOptions moet met name gelijk zijn aan None om ervoor te zorgen dat één fasedoorvoering wordt uitgevoerd.

Omdat de ISinglePhaseNotification interface is afgeleid van de IEnlistmentNotification interface en uw RM niet in aanmerking komt voor doorvoeren in één fase, kan deze nog steeds de twee fasedoorvoermeldingen ontvangen. Als uw RM een SinglePhaseCommit kennisgeving van de TM ontvangt, moet deze proberen het werk uit te voeren dat nodig is om door te voeren. Vervolgens moet de transactiebeheerder worden geïnformeerd of de transactie moet worden bevestigd of teruggedraaid. Dit gebeurt door de methode Committed, Aborted, of InDoubt aan te roepen op de SinglePhaseEnlistment parameter. Een reactie op Done het inschrijven in deze fase duidt op ReadOnly-semantiek. Daarom moet u niet reageren Done tegelijkertijd met een van de andere beschikbare methoden.

Als er slechts één vluchtige betrokkenheid is en er geen duurzame betrokkenheid is, ontvangt de vluchtige betrokkenheid een SPC-melding. Als er vluchtige insluitingen zijn en slechts één duurzame opname, ontvangen de vluchtige insluitingen 2PC. Wanneer het is voltooid, krijgt de duurzame inschrijving SPC.

Zie ook