Implementera en Resource Manager
Varje resurs som används i en transaktion hanteras av en resurshanterare vars åtgärder samordnas av en transaktionshanterare. Resursansvariga arbetar i samarbete med transaktionshanteraren för att ge programmet en garanti för atomitet och isolering. Microsoft SQL Server, varaktiga meddelandeköer, minnesinterna hash-tabeller är alla exempel på resurshanterare.
En resurshanterare hanterar antingen varaktiga eller flyktiga data. Hållbarheten (eller omvänt volatiliteten) för en resurshanterare refererar till om resurshanteraren stöder återställning av fel. Om en resurshanterare stöder felåterställning bevaras data till varaktig lagring under fas1 (förbereda) så att om resurshanteraren slutar fungera kan den återlista transaktionen vid återställning och utföra rätt åtgärder baserat på meddelandena som tas emot från transaktionshanteraren. I allmänhet hanterar flyktiga resurshanterare flyktiga resurser, till exempel en minnesintern datastruktur (till exempel en transacted-hashtable i minnet) och hållbara resurshanterare hanterar resurser som har ett mer beständigt lagringslager (till exempel en databas vars lagringsplats är disk).
För att en resurs ska kunna delta i en transaktion måste den registrera sig i transaktionen. Klassen Transaction definierar en uppsättning metoder vars namn börjar med Enlist som tillhandahåller den här funktionen. De olika metoderna för att lista motsvarar de olika typer av enlistning som en resurshanterare kan ha. Mer specifikt använder EnlistVolatile du metoderna för flyktiga resurser och EnlistDurable metoden för varaktiga resurser. För enkelhetens EnlistDurable skull bör du, när du har bestämt dig för om du vill använda metoden eller EnlistVolatile baserat på resursens hållbarhetsstöd, registrera resursen IEnlistmentNotification för att delta i Två fasincheckning (2PC) genom att implementera gränssnittet för resurshanteraren. Mer information om 2PC finns i Checka in en transaktion i enfas och flera faser.
Genom att registrera ser resurshanteraren till att den får återanrop från transaktionshanteraren när transaktionen checkas in eller avbryts. Det finns en instans av IEnlistmentNotification per registrering. Vanligtvis finns det en registrering per transaktion, men en resurshanterare kan välja att registrera flera gånger i samma transaktion.
Efter enlistning svarar resurshanteraren på transaktionens begäranden. En beständig resurshanterare lagrar tillräckligt med information så att den antingen kan ångra eller göra om transaktionens arbete med resurser som hanteras. Det finns många sätt att göra detta; att behålla versioner av data eller att hålla en logg över ändringarna är två vanliga tekniker.
När programmet genomför transaktionen initierar transaktionshanteraren incheckningsprotokollet i två faser. Transaktionshanteraren frågar först varje registrerad resurshanterare om den är beredd att genomföra transaktionen. Resurshanteraren måste förbereda sig för incheckning – den läser sig själv för att antingen checka in eller avbryta transaktionen.
Under förberedelsefasen registrerar den hållbara resurshanteraren gamla och nya data i stabil lagring så att resurshanteraren kan återställa dem även om systemet misslyckas. Om resurshanteraren kan förbereda sig informerar den transaktionshanteraren om huruvida transaktionen ska genomföras eller avbrytas. Om någon resurshanterare rapporterar att det inte går att förbereda skickar transaktionshanteraren ett återställningskommando till varje resurshanterare och anger att incheckningen av programmet misslyckades.
När resurshanteraren har förberetts måste den vänta tills den får ett inchecknings- eller avbrutet återanrop från transaktionshanteraren i fas 2. Normalt slutförs hela förberedelse- och incheckningsprotokollet på en bråkdel av en sekund. Om det uppstår system- eller kommunikationsfel kanske inchecknings- eller avbrutna meddelanden inte kommer in på några minuter eller timmar. Under den här perioden är resurshanteraren osäker på resultatet av transaktionen. Den vet inte om transaktionen har checkats in eller avbrutits. Även om resurshanteraren är osäker på en transaktion, behåller den datan ändrad genom att hålla transaktionen låst, vilket isolerar dessa ändringar från andra transaktioner.
När en resurshanterare misslyckas avbryts alla dess registrerade transaktioner förutom de som har förberetts eller checkats in före felet. När en beständig resurshanterare startas om rekonstrueras det bekräftade tillståndet för de resurser som hanteras genom att förbereda informationen som skrivits i förberedelsefasen och checkar in eller avbryter dessa transaktioner i enlighet med detta.
Sammanfattningsvis kombineras incheckningsprotokollet med två faser och resurshanteringarna för att göra transaktionerna atomiska och hållbara.
Klassen Transaction innehåller också metoden EnlistPromotableSinglePhase för att registrera en PSPE (Promotable Single Phase Enlistment). På så sätt kan en beständig resurshanterare (RM) vara värd för och "äga" en transaktion som senare kan eskaleras till att hanteras av MSDTC om det behövs. Mer information om detta finns i Optimering med hjälp av enfasincheckning och meddelande om enkel fas i kampanjtabell.
I det här avsnittet
Stegen som vanligtvis följs av en resurshanterare beskrivs i följande avsnitt.
Registrera resurser som deltagare i en transaktion
Beskriver hur en beständig eller flyktig resurs kan registrera sig i en transaktion.
Genomföra en transaktion i enfas och flera faser
Beskriver hur en resurshanterare svarar på incheckningsmeddelandet och förbereder incheckningen.
Beskriver hur en beständig resurshanterare återställs från fel.
Säkerhetsförtroendenivåer för åtkomst till resurser
Beskriver hur de tre förtroendenivåerna för System.Transactions begränsar åtkomsten till de typer av resurser som System.Transactions exponeras.
Optimering med hjälp av enfasincheckning och meddelande om enkel fas i kampanjtabell
Beskriver optimeringsmetoder som är tillgängliga för implementeringar av resurshanterare.