Optimering med hjälp av enfasincheckning och meddelande om enkel fas i kampanjtabell
Det här avsnittet beskriver de mekanismer som tillhandahålls av System.Transactions infrastrukturen för att optimera prestanda.
Enlistning av kampanjtabell med en 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 måste ha stöd för konvertering av dessa transaktioner till distribuerade transaktioner vid körning. Sql Server 2005 är till exempel en sådan resurshanterare. I sådana fall System.Transactions tar infrastrukturen en passiv hanteringsroll genom att bara övervaka transaktionen för ett 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 listan lyckas skapar RM sin interna transaktion och associerar den System.Transactions med transaktionen. Om PSPE-enlistningen misslyckas bör RM i stället ta med 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 listas konverteras anrop av klienter för att checka in eller avbryta System.Transactions transaktionen till anrop på Resource Manager genom att SinglePhaseCommit anropa metoden eller Rollback respektive .
System.Transactions Om transaktionen aldrig kräver eskalering får RM ett SinglePhaseCommit meddelande när transaktionen har checkats in. Den kan sedan checka in den interna transaktion som ursprungligen skapades.
System.Transactions Om transaktionen behöver eskaleras (t.ex. för att stödja flera virtuella datorer) System.Transactions informerar resurshanteraren genom att anropa Promote metoden i ITransactionPromoter gränssnittet, från vilken IPromotableSinglePhaseNotification 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 checka in skickar SinglePhaseCommit transaktionshanteraren fortfarande meddelandet till resurshanteraren, som genomför den distribuerade transaktion som den skapade under eskalering.
Kommentar
TransactionCommitted-spårningarna (som genereras när en incheckning anropas för den eskalerade 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 registrera 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.TransactionsPromote anropar metoden i gränssnittet som ITransactionPromoter 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 enfasincheckning
Protokollet För genomförande av en fas är effektivare vid körning eftersom alla uppdateringar görs utan någon explicit samordning. För att dra nytta av den här optimeringen EnlistDurable 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 metoden ellerEnlistVolatile. Mer specifikt bör parametern EnlistmentOptions vara lika None med för att säkerställa att en enda fasincheckning utförs.
ISinglePhaseNotification Eftersom gränssnittet härleds från IEnlistmentNotification gränssnittet kan rm-programmet fortfarande ta emot de två fasincheckningsmeddelandena om att din RM inte är berättigad till en enda fas. 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 checkas in eller återställas genom att anropa Committedmetoden , Abortedeller InDoubt på parametern SinglePhaseEnlistment . Ett svar Done på i listan i det här skedet innebär ReadOnly-semantik. Därför bör du inte svara Done utöver någon av de andra metoderna.
Om det bara finns en flyktig registrering och ingen varaktig registrering, får den flyktiga värvningen SPC-meddelande. 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.