Eskalering av transaktionshantering
Windows är värd för en uppsättning tjänster och moduler som tillsammans utgör en transaktionshanterare. Eskalering av transaktionshantering beskriver processen att migrera en transaktion från en av transaktionshanterarens komponenter till en annan.
System.Transactions innehåller en transaktionshanterarkomponent som samordnar en transaktion som mest omfattar en enda varaktig resurs eller flera flyktiga resurser. Eftersom transaktionshanteraren endast använder domänanrop inom program ger den bästa prestanda. Utvecklare behöver inte interagera direkt med transaktionshanteraren. I stället tillhandahålls en gemensam infrastruktur som definierar gränssnitt, vanligt beteende och hjälpklasser av System.Transactions namnområdet.
När du vill tillhandahålla transaktionen till ett objekt i en annan programdomän (inklusive över process- och datorgränser) på samma dator System.Transactions eskalerar infrastrukturen automatiskt transaktionen så att den hanteras av Microsoft Distributed Transaction Coordinator (MSDTC). Eskalering sker också om du registrerar en annan beständig resurshanterare. När den eskaleras förblir transaktionen hanterad i sitt förhöjda tillstånd tills den har slutförts.
System.Transactions Mellan transaktionen och MSDTC-transaktionen finns det en mellanliggande typ av transaktion som görs tillgänglig via PSPE (Promotable Single Phase Enlistment). PSPE är en annan viktig mekanism System.Transactions för prestandaoptimering. Det gör att en 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. Mer information om PSPE finns i Registrera resurser som deltagare i en transaktion.
Så initieras eskalering
Transaktionseskalering minskar prestandan eftersom MSDTC finns i en separat process, och eskalera en transaktion till MSDTC resulterar i att meddelanden skickas över processen. För att förbättra prestandan bör du fördröja eller undvika eskalering till MSDTC. Därför behöver du veta hur och när eskalering initieras.
Så länge System.Transactions infrastrukturen hanterar flyktiga resurser och högst en hållbar resurs som stöder meddelanden i en fas, förblir transaktionen ägare till System.Transactions infrastrukturen. Transaktionshanteraren utnyttjar endast de resurser som finns i samma programdomän och för vilka loggning (att skriva transaktionsresultatet till disken) inte krävs. En eskalering som resulterar i System.Transactions att infrastrukturen överför ägarskapet för transaktionen till MSDTC sker när:
Minst en varaktig resurs som inte stöder meddelanden med en fas tas med i transaktionen.
Minst två varaktiga resurser som stöder meddelanden med en fas tas med i transaktionen. Om du till exempel registrerar en enda anslutning med SQL Server 2005 kan det inte leda till att en transaktion höjs upp. Men när du öppnar en andra anslutning till en SQL Server 2005-databas som gör att databasen registreras identifierar System.Transactions infrastrukturen att den är den andra hållbara resursen i transaktionen och eskalerar den till en MSDTC-transaktion.
En begäran om att "konvertera" transaktionen till en annan programdomän eller en annan process anropas. Till exempel serialiseringen av transaktionsobjektet över en programdomängräns. Transaktionsobjektet är efter värde, vilket innebär att alla försök att skicka det över en programdomängräns (även i samma process) resulterar i serialisering av transaktionsobjektet. Du kan skicka transaktionsobjekten genom att göra ett anrop på en fjärrmetod som tar en Transaction som en parameter eller så kan du försöka komma åt en fjärrtransaktionsbaserad komponent. Detta serialiserar transaktionsobjektet och resulterar i en eskalering, som när en transaktion serialiseras över en programdomän. Den distribueras och den lokala transaktionshanteraren är inte längre tillräcklig.
I följande tabell visas alla möjliga undantag som kan genereras under eskalering.
Undantagstyp | Villkor |
---|---|
InvalidOperationException | Ett försök att eskalera en transaktion med isoleringsnivån lika Snapshotmed . |
TransactionAbortedException | Transaktionshanteraren är nere. |
TransactionException | Eskalering misslyckas och programmet avbryts. |