Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet beskriver de mekanismer som tillhandahålls av System.Transactions infrastrukturen för att optimera prestanda.
Enrollering för befordringsbar enkel fas
Infrastrukturen System.Transactions administrerar en transaktion i en enda programdomän som mest omfattar en enda varaktig resurs eller flera flyktiga resurser. System.Transactions Eftersom infrastrukturen endast använder domänanrop inom program ger den bästa dataflöde och prestanda.
Men om transaktionen tillhandahålls till ett annat objekt i en annan programdomän (inklusive över process- och datorgränser) på samma dator, eller om du skulle registrera en annan beständig resurshanterare, System.Transactions eskalerar infrastrukturen automatiskt transaktionen så att den hanteras av MSDTC. En transaktion som hanteras av MSDTC är inte lika prestandamässigt som en som hanteras av System.Transactions infrastrukturen.
För att optimera prestanda tillhandahåller System.Transactions infrastrukturen PSPE (Promotable Single Phase Enlistment) som gör att en enda fjärrhållbar resurs, som finns i en annan programdomän, process eller dator, kan delta i en System.Transactions transaktion utan att den eskaleras till en MSDTC-transaktion. Den här resurshanteraren (RM) kan vara värd för och "äga" en transaktion som senare kan eskaleras till en distribuerad transaktion (eller MSDTC-transaktion) om det behövs. Detta minskar risken för att använda MSDTC.
Den här specifika resurshanteraren har vanligtvis sina egna interna icke-distribuerade transaktioner och behöver stöd för att konvertera dessa transaktioner till distribuerade transaktioner under körningen. Sql Server 2005 är till exempel en sådan resurshanterare. I sådana fall tar System.Transactions infrastrukturen en passiv hanteringsroll genom att bara övervaka transaktionen vid behov av eskalering. För att stödja interaktionen System.Transactions mellan infrastrukturen och resurshanteraren måste den senare implementera gränssnittet IPromotableSinglePhaseNotification.
Metoden EnlistPromotableSinglePhase används för att registrera en enda hållbar resurs som kan eskaleras senare. Den här metoden säkerställer att listan kan eskaleras efter behov. Om rekryteringen lyckas, skapar RM sin interna transaktion och associerar den med System.Transactions transaktionen. Om PSPE-enlistningen misslyckas bör RM i stället registrera sig med hjälp av metoden EnlistDurable. Fel vid registrering i PSPE kan inträffa när transaktionen redan är en distribuerad transaktion, eller när en annan RM redan har utfört en PSPE-registrering
När en är registrerad omvandlas klienters anrop för att genomföra eller avbryta System.Transactions transaktionen till anrop på Resource Manager genom att anropa SinglePhaseCommit respektive Rollback metoden.
Om transaktionen aldrig kräver eskalering, får RM ett System.Transactions meddelande när transaktionen har godkänts. Den kan sedan bekräfta den interna transaktion som ursprungligen skapades.
Om transaktionen behöver eskaleras (t.ex. för att stödja flera resurshanterare) informerar System.Transactions resurshanteraren genom att anropa System.Transactions metoden i Promote gränssnittet, från vilket ITransactionPromoter gränssnittet härleds. Resurshanteraren konverterar sedan transaktionen internt från en lokal transaktion (som inte kräver loggning) till ett transaktionsobjekt som kan delta i en DTC-transaktion och associerar den med det arbete som redan har utförts. När transaktionen uppmanas att genomföra skickar transaktionshanteraren fortfarande en notifiering till resurshanteraren, som genomför den distribuerade transaktionen som den skapade vid eskalationen.
Anmärkning
TransactionCommitted-spårningarna (som genereras när en Commit anropas för den upptrappade transaktionen) innehåller aktivitets-ID för DTC-transaktionen.
Mer information om hanteringseskalering finns i Eskalering av transaktionshantering.
Eskaleringsscenario för transaktionshantering
Följande scenario visar en eskalering till en distribuerad transaktion med namnområdet System.Data som "proxy" för resurshanteraren. Det här scenariot förutsätter att det redan finns en System.Data anslutning till databasen, CN1, som är involverad i transaktionen och att programmet vill involvera en annan System.Data anslutning, CN2. Transaktionen måste eskaleras till DTC som en fullständig distribuerad transaktion med två faser.
I det här scenariot
CN1 anropar EnlistPromotableSinglePhase metoden för att engagera sig i transaktionen. Sedan är transaktionen fortfarande lokal och det finns inga andra promotable-listor för transaktionen, så anropet EnlistPromotableSinglePhase lyckas.
När den andra anslutningen, CN2 anropar EnlistPromotableSinglePhase, misslyckas anropet eftersom det finns en annan promotable-lista. På grund av detta måste CN2 hämta en DTC-transaktion för att kunna skicka den till SQL. För att göra detta använder den en av metoderna som tillhandahålls av TransactionInterop klassen för att skapa ett format för transaktionen som kan ges till SQL.
System.Transactions anropar Promote-metoden på ITransactionPromoter-gränssnittet som implementeras av CN1.
Nu eskalerar CN1 transaktionen med hjälp av någon mekanism som är specifik för SQL 2005 och System.Data.
Returvärdet från Promote metoden är en bytematris som innehåller en spridningstoken för transaktionen. System.Transactions använder den här spridningstoken för att skapa en DTC-transaktion som den kan införliva i den lokala transaktionen.
I det här läget kan CN2 använda de data som tas emot från att anropa någon av metoderna genom TransactionInterop för att skicka transaktionen till SQL.
Nu är båda registrerade i en DTC-distribuerad transaktion.
Optimering av engångsfascommit
Enfascommit-protokollet är mer effektivt vid körning eftersom alla uppdateringar genomförs utan någon explicit samordning. För att dra nytta av den här optimeringen bör du implementera en resurshanterare med hjälp av ISinglePhaseNotification-gränssnittet för resursen och registrera i en transaktion med hjälp av EnlistDurable- eller EnlistVolatile-metoden. Mer specifikt bör parametern EnlistmentOptions vara lika med None för att säkerställa att en enfasöverenskommelse utförs.
Eftersom ISinglePhaseNotification-gränssnittet härleds från IEnlistmentNotification-gränssnittet, kan din RM fortfarande ta emot meddelanden om tvåfas-commits även om din RM inte är berättigad till en enfas-commit. Om RM får ett SinglePhaseCommit-meddelande från TM bör den försöka utföra det arbete som krävs för att genomföra och på motsvarande sätt informera transaktionshanteraren om transaktionen ska genomföras eller återställas genom att anropa Committed, Aborted eller InDoubt metoden på parametern SinglePhaseEnlistment. Ett svar Done vid registrering i det här skedet innebär enbart läsbar semantik. Därför bör du inte svara Done utöver någon av de andra metoderna.
Om det bara finns en flyktig anslutning och ingen varaktig anslutning, får den flyktiga anslutningen SPC-notifikation. Om det finns några flyktiga värvningar och bara en varaktig värvning får de flyktiga värvningarna 2PC. När den är klar får den varaktiga listan SPC.