Virtuális óraértékek használata

A KTM minden tranzakciókezelő objektumhoz biztosít egy virtuális órát. Amikor egy erőforrás-kezelő meghívja a ZwCreateTransactionManagert, a KTM az objektum virtuális óraértékét 1 értékre állítja. A KTM minden alkalommal növeli a virtuális óra értékét, amikor egy véglegesítési művelet megkezdődik. Amikor a KTM a naplóstreambe ír, a naplórekordok tartalmazzák az aktuális virtuális óra értékét is.

Amikor egy erőforrás-kezelő meghívja a ZwRecoverTransactionManagert, a KTM beolvassa a naplóstream rekordjait a stream végéig, és a tranzakciókezelő objektum virtuális óraértékét az objektum naplóstreamjében talált utolsó értékre állítja.

Amikor egy erőforrás-kezelő meghívja a ZwRollforwardTransactionManagert, a KTM beolvassa a naplóstream rekordjait a megadott óraértékig, és beállítja a tranzakciókezelő objektum virtuális óraértékét a megadott óraértékre.

A KTM lehetővé teszi, hogy az erőforrás-kezelők és a felsőbb szintű tranzakciókezelők módosítsák egy tranzakciókezelő objektum virtuális óraértékét, de általában nem kell módosítaniuk az óraértéket.

Mikor kell módosítani a virtuális óra értékeit?

A tranzakciófeldolgozó rendszernek (TPS) általában nem kell módosítania a virtuális óra értékeit, hacsak a TPS összetevői nem próbálnak több naplóstreamet szinkronizálni.

Tegyük fel például, hogy a TPS több erőforrás-kezelőt tartalmaz, amelyek kommunikálnak egymással az előkészületi/előkészítési/véglegesítési sorozatok során. Tegyük fel, hogy minden erőforrás-kezelő létrehoz egy tranzakciókezelő objektumot, amely egyedi naplóstreamel rendelkezik. Ha meg szeretné győződni arról, hogy a KTM a helyreállítási művelet során az összes erőforrás-kezelő állapotát ugyanarra a pontra állítja vissza, ezek az erőforrás-kezelők a következő lépéseket használhatják:

  • Amikor az egyik erőforrás-kezelő kommunikál egy másikkal, az átadja a KTM-től vagy egy másik erőforrás-kezelőtől kapott legújabb virtuális óraértéket.

  • Amikor egy erőforrás-kezelő olyan KTM-rutint hív meg, amely elfogad egy virtuális óraértéket (lásd a jelen témakör következő szakaszát), a KTM-től vagy egy másik erőforrás-kezelőtől kapott legmagasabb óraértéket adja át.

  • Minden erőforrás-kezelő virtuális óraértékeket ír a naplóstreambe, és ezeket az értékeket használja a visszaállítási vagy helyreállítási műveletek végrehajtásakor.

Ezek a lépések miatt a KTM által az egyes tranzakciókezelő objektumokhoz tárolt virtuálisóra-értékek majdnem vagy pontosan egyeznek. Ezért ha egy helyreállítási művelet miatt a KTM beolvassa a naplóstreameket, vagy ha egy visszaállítási művelet miatt az erőforrás-kezelők beolvassák a naplóstreameket, a helyreállítás vagy a visszaállítás szinkronizált naplóstreameken alapul.

Virtuális óra értékeinek módosítása

Az erőforrás-kezelők úgy módosíthatják a virtuális óra értékét, hogy átadnak egy új értéket a ZwPrePrepareComplete, a ZwPrepareComplete, a ZwCommitComplete, a ZwRollbackComplete, a ZwReadOnlyEnlistment vagy a ZwSinglePhaseReject fájlnak.

A felsőbb szintű tranzakciókezelők úgy módosíthatják a virtuális óra értékét, hogy átadnak egy új értéket a ZwPrePrepareEnlistment, a ZwPrepareEnlistment, a ZwCommitEnlistment vagy a ZwReadOnlyEnlistment szolgáltatásnak.

Emellett a ResourceManagerNotification visszahívási rutint használó erőforrás-kezelő vagy kiváló tranzakciókezelő módosíthatja a visszahívási rutin által kapott virtuális óraértéket. A KTM ezután menti a frissített értéket.

Ha egy erőforrás-kezelő vagy egy kiváló tranzakciókezelő átad egy új óraértéket a KTM-nek, a KTM csak akkor menti az új értéket, ha az nagyobb az aktuális óraértéknél. Ellenkező esetben a KTM megtartja az aktuális óraértéket.

Az erőforrás-kezelők és a felsőbb szintű tranzakciókezelők a ZwQueryInformationTransactionManager rutin meghívásával szerezhetik be a tranzakciókezelő objektum virtuális óraértékét.