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.

Promotable Single Phase Enlistment

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 opname slaagt, maakt de RM de interne transactie 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 aanroepen door clients om de System.Transactions transactie door te voeren of af te breken geconverteerd naar aanroepen in Resource Manager door de SinglePhaseCommit methode of respectievelijk aan Rollback te roepen.

Als de System.Transactions transactie nooit escalatie vereist, ontvangt de RM een SinglePhaseCommit melding wanneer de transactie wordt doorgevoerd. Vervolgens kan de interne transactie worden doorgevoerd die in eerste instantie is gemaakt.

Als de System.Transactions transactie moet worden geëscaleerd (bijvoorbeeld ter ondersteuning van meerdere VM's), System.Transactions informeert u de resourcemanager door de Promote methode op de ITransactionPromoter interface aan te roepen waaruit 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.

Notitie

De TransactionCommitted-traceringen (die worden gegenereerd wanneer een doorvoer wordt aangeroepen op de geëscaleerde transactie) bevatten de activiteits-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 zijn er geen andere promotielijsten voor de transactie, dus de EnlistPromotableSinglePhase aanroep slaagt.

  2. Wanneer de tweede verbinding cn2 aanroept EnlistPromotableSinglePhase, mislukt de aanroep omdat er nog een promotielijst 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.

Optimalisatie van doorvoeren met één fase

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 behulp van ISinglePhaseNotification de interface voor de resource en een transactie in een transactie opnemen met behulp 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 melding van de TM ontvangt, moet deze proberen het werk uit te voeren dat nodig is om deze door te voeren en de transactiebeheerder overeenkomstig te informeren als de transactie moet worden doorgevoerd of teruggedraaid door de Committedparameter aan Abortedte roepen, of InDoubt de methode voor de SinglePhaseEnlistment parameter. Een reactie op Done de opname in deze fase impliceert ReadOnly-semantiek. Daarom moet u niet reageren Done naast een van de andere methoden.

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

Zie ook