Delen via


Een Resource Manager maken

Resource managers houden de gegevens van elke transactie bij en registreren de bewerkingen van de transactie. Als een transactieverwerkingssysteem (TPS) meerdere resourcemanagers heeft, kan elke resourcemanager deelnemen aan de doorvoer-, terugdraai- en herstelbewerkingen van elke transactie.

Elke resourcemanager moet een interface exporteren die transactionele clients kunnen gebruiken om toegang te krijgen tot de database of een andere resource die de Resource Manager onderhoudt.

Normaal gesproken moet een resourcebeheerder in de kernelmodus de volgende taken uitvoeren in de vermelde volgorde:

  1. Maak een logboekstroom.

    Resourcebeheerders kunnen de Common Log File System (CLFS) of een andere mogelijkheid voor logboekregistratie gebruiken om hun logboekstreams te onderhouden. Een aanroep naar ClfsCreateLogFile maakt een CLFS-logboekstream. De Resource Manager moet de logboekstroom gebruiken om informatie vast te leggen die nodig is om transacties door te voeren, terug te draaien of te herstellen. Bovendien gebruikt KTM de logboekstroom om eventuele interne statuswijzigingen vast te leggen die nodig kunnen zijn om transacties te herstellen.

  2. Maak een transaction manager-object.

    Een aanroep van ZwCreateTransactionManager maakt een transaction manager-object en verbindt de resourcemanager met een extra CLFS-logboekstroom die de resourcemanager opgeeft.

  3. Herstel de status van transactiebeheerder.

    Een aanroep van ZwRecoverTransactionManager leest de logboekstroom van het transactiebeheerobject (die KTM onderhoudt) en bepaalt of de TPS is afgesloten voordat alle transacties zijn voltooid (bijvoorbeeld omdat het systeem is vastgelopen). KTM herstelt de interne status op basis van informatie in de logboekstroom.

  4. Maak een Resource Manager-object.

    Een aanroep van ZwCreateResourceManager maakt een Resource Manager-object en koppelt dit aan het eerder gemaakte transaction manager-object.

  5. Herstel de status van resource manager.

    Een aanroep van ZwRecoverResourceManager zorgt ervoor dat KTM de resourcemanager TRANSACTION_NOTIFY_RECOVER-meldingen verzendt voor alle transacties die in behandeling waren toen de resourcemanager de laatste keer werd afgesloten. Voor informatie over hoe de resource manager op deze meldingen moet reageren, zie Herstelbewerkingen verwerken.

  6. Transacties ontvangen van clients.

    Normaal gesproken maakt een client een transactieobject en gebruikt de clientinterface van resource manager om de GUID van het transactieobject door te geven aan de resourcemanager. De resourcemanager kan bijvoorbeeld een CreateDataObject routine bieden die vergelijkbaar is met de routine die TPS-onderdelen onderwerp beschrijft.

  7. Schakel elke transactie in.

    Een aanroep van ZwOpenTransaction opent een ingang voor het transactieobject en vervolgens een aanroep naar ZwCreateEnlistment maakt een aanroep voor de transactie. Met de aanmelding kan de resourcebeheerder een opgegeven set van transactiemeldingen ontvangen.

  8. De ontvangst van transactiemeldingen inschakelen.

    De resourcemanager kan ZwGetNotificationResourceManager aanroepen om meldingen synchroon te verkrijgen of kan TmEnableCallbacks aanroepen om een ResourceManagerNotification- callbackroutine te registreren die KTM aanroept wanneer er een melding beschikbaar is.

  9. Dien toegangsaanvragen van servicebronnen van klanten in, maar maak de wijzigingen niet permanent.

    Nadat een client een transactieobject heeft gemaakt, wordt doorgaans de interface van de resourcebeheerder aangeroepen voor toegang tot de resource van de resourcebeheerder. Een resourcemanager voor een database kan bijvoorbeeld aanvragen ontvangen om van de database te lezen en naar de database te schrijven.

    De resourcemanager moet de resultaten van de lees- en schrijfbewerkingen vastleggen in een CLFS-logboekstream of een andere mogelijkheid voor logboekregistratie totdat er een melding wordt ontvangen dat de bewerkingen van de transactie worden doorgevoerd, teruggedraaid of hersteld.

  10. Clientbewerkingen doorvoeren of terugdraaien.

    Uiteindelijk ontvangt de Resource Manager een melding om te beginnen met het doorvoeren of terugdraaien van de bewerkingen die de client heeft uitgevoerd. Als reactie moet de resourcemanager de clientbewerkingen permanent maken of verwijderen. Zie Transactiebewerkingenvoor meer informatie over het omgaan met doorvoer- en herstelmeldingen.

    Soms moet een resourcemanager mogelijk proberen KTM te dwingen snel een melding van bevestiging of terugdraaien te geven, bijvoorbeeld omdat de resourcemanager heeft vastgesteld dat een apparaat onverwacht is verwijderd. In een dergelijk geval kan de resourcemanager TmRequestOutcomeEnlistmentaanroepen.

  11. Sluit het handvat van het enlistment object.

    Nadat de resourcemanager de transactie heeft verwerkt, moet deze ZwClose- aanroepen om de ingang van het aanmeldobject te sluiten

  12. Sluit de resource manager-objecthandgreep en de transactiebeheerobjectingang.

    Voordat de resourcemanager wordt uitgeladen, moet deze ZwClose aanroepen om het handvat van het resourcemanagerobject en het transactiemanagerobject te sluiten.

Stap 1 tot en met 5 moet worden uitgevoerd in de initialisatiecode van uw Resource Manager. Als uw Resource Manager bijvoorbeeld een kernelmodusstuurprogramma is, is de initialisatiecode de DriverEntry- routine van het stuurprogramma.

Stap 6 tot en met 11 wordt doorgaans uitgevoerd in code die reageert op aanvragen van transactionele clients.

Stap 12 moet worden uitgevoerd in de uiteindelijke opschooncode van uw resourcemanager, zoals de Unload-routine van een kernelmodusstuurprogramma.

Een Read-Only-inschrijving maken

Een alleen-lezen-inschrijving is een inschrijving die geen meldingen ontvangt van KTM. Een resourcemanager kan elke aanmelding alleen lezen maken door ZwReadOnlyEnlistmentaan te roepen. Deze aanroep zorgt ervoor dat KTM stopt met het leveren van meldingen aan de resourcemanager.

Nadat uw resourcemanager ZwCreateEnlistmentheeft aangeroepen, kan deze op elk gewenst moment ZwReadOnlyEnlistment aanroepen tot het punt waarop deze gewoonlijk ZwPrepareCompletezou aanroepen.

Er zijn twee redenen waarom u wilt dat uw resourcemanager ZwReadOnlyEnlistmentaanroept.

  • Uw resourcemanager heeft aan een transactie deelgenomen en op een bepaald moment voordat deze een TRANSACTION_NOTIFY_COMMIT melding ontvangt, bepaalt de resourcemanager dat deze niet langer hoeft deel te nemen aan de doorvoerbewerking van de transactie.

    Wanneer de resourcemanager bijvoorbeeld een melding van TRANSACTION_NOTIFY_PREPARE ontvangt, kan worden vastgesteld dat geen van de bewerkingen van de transactie de database van resource manager heeft gewijzigd. De resourcemanager kan ZwReadOnlyEnlistment aanroepen in plaats van ZwPrepareComplete- om zichzelf uit de transactie te verwijderen.

  • Uw Resource Manager neemt nooit deel aan de doorvoerbewerking van een transactie.

    Uw Resource Manager kan bijvoorbeeld gegevens bewaken die door de client worden verzonden, zonder de opgeslagen database te wijzigen. In dit geval kan uw resourcemanager ZwReadOnlyEnlistment aanroepen direct nadat deze ZwCreateEnlistmentheeft aangeroepen. Daarnaast kunt u ervoor kiezen om een dergelijke Resource Manager vluchtigete maken, zoals beschreven in de volgende sectie van dit onderwerp.

Nadat een resourcemanager ZwReadOnlyEnlistmentheeft aangeroepen, kan deze ZwClose aanroepen om de enlistment-handle te sluiten.

Een Volatile-Resource Manager maken

Een vluchtige-resourcemanager is een resourcemanager die geen duurzame gegevens onderhoudt. U kunt bijvoorbeeld een vluchtig resourcebeheer maken om gegevens te bewaken die de client verzendt als de resourcemanager een duurzaam opgeslagen database niet wijzigt. Vluchtige resourcemanagers registreren doorgaans geen transactieactiviteit en kunnen daarom geen herstel- of terugdraaibewerkingen uitvoeren.

Een vluchtige resourcemanager moet de vlag RESOURCE_MANAGER_VOLATILE instellen wanneer deze ZwCreateResourceManageraanroept. Als deze vlag is ingesteld, logt KTM geen gegevens over de resourcemanager in de logboekstroom van het gekoppelde transaction manager-object.

Uw resourcemanager kan ook een TRANSACTION_MANAGER_VOLATILE vlag instellen wanneer deze ZwCreateTransactionManageraanroept. Als deze vlag is ingesteld, maakt KTM geen logboekstream voor het transaction manager-object. Daarnaast moeten eventuele extra resourcemanagers die zijn verbonden met het transaction manager-object ook vluchtig zijn en de vlag RESOURCE_MANAGER_VOLATILE instellen.

Een Resource Manager toevoegen aan een bestaande TPS

Als u een extra Resource Manager moet toevoegen aan een bestaande TPS, hebt u twee opties:

  • Uw nieuwe resourcemanager roept ZwCreateTransactionManager aan om een eigen transaction manager-object te maken.

    Gebruik deze keuze als uw resourcemanager niet communiceert met andere resourcemanagers in de TPS.

  • Uw nieuwe resourcemanager roept ZwOpenTransactionManager aan om verbinding te maken met een bestaand transaction manager-object.

    Gebruik deze keuze als uw resourcemanager moet communiceren met andere resourcemanagers in de TPS. De resourcemanager die ZwCreateTransactionManager aanroept, moet de GUID, logboekstreamnaam of objectnaam van het transactiebeheerobject delen, zodat andere resourcemanagers ZwOpenTransactionManagerkunnen aanroepen. Deze andere resourcebeheerders kunnen ZwQueryInformationTransactionManager aanroepen om aanvullende informatie over het transactiebeheerobject te verkrijgen.

Nadat u uw resource manager aan de TPS hebt toegevoegd, kunnen klanten die bekend zijn met uw resource manager de clientinterface van de resource manager aanroepen.