Uso dei valori dell'orologio virtuale

KTM fornisce un orologio virtuale per ogni oggetto di gestione transazioni. Quando un gestore di risorse chiama ZwCreateTransactionManager, KTM imposta il valore dell'orologio virtuale dell'oggetto su 1. KTM incrementa il valore dell'orologio virtuale ogni volta che inizia un'operazione di commit. Ogni volta che KTM scrive nel flusso di log, include il valore dell'orologio virtuale corrente nel record di log.

Quando un gestore di risorse chiama ZwRecoverTransactionManager, KTM legge i record del flusso di log fino alla fine del flusso e imposta il valore dell'orologio virtuale dell'oggetto gestione transazioni sull'ultimo valore trovato nel flusso di log dell'oggetto.

Quando un gestore di risorse chiama ZwRollforwardTransactionManager, KTM legge i record del flusso di log fino al valore di clock specificato e imposta il valore dell'orologio virtuale dell'oggetto di gestione transazioni sul valore dell'orologio specificato.

KTM consente ai gestori risorse e ai gestori di transazioni superiori di modificare il valore di clock virtuale di un oggetto di gestione transazioni, ma in genere non è necessario modificare il valore dell'orologio.

Quando modificare i valori dell'orologio virtuale

In genere, il sistema di elaborazione delle transazioni (TPS) non deve modificare i valori dell'orologio virtuale, a meno che i componenti nel tps non tentino di sincronizzare più flussi di log.

Si supponga, ad esempio, che il tps contenga più gestori di risorse che comunicano tra loro durante le sequenze di pre-preparazione/preparazione/commit. Si supponga anche che ogni gestore risorse crei un oggetto gestione transazioni con un flusso di log univoco. Per assicurarsi che KTM ripristini lo stato di tutti i gestori di risorse allo stesso punto nel tempo durante un'operazione di ripristino, questi gestori di risorse potrebbero usare la procedura seguente:

  • Quando un gestore di risorse comunica con un altro, passa il valore di clock virtuale più recente ricevuto da KTM o da un altro gestore di risorse.

  • Ogni volta che un gestore di risorse chiama una routine KTM che accetta un valore di clock virtuale (vedere la sezione seguente in questo argomento), passa il valore di clock più alto ricevuto da KTM o da un altro gestore risorse.

  • Ogni resource manager scrive i valori dell'orologio virtuale nel flusso di log e usa tali valori quando esegue operazioni di rollback o ripristino.

Questi passaggi determinano che i valori dell'orologio virtuale archiviati da KTM per ogni oggetto di gestione transazioni corrispondano quasi o esattamente. Pertanto, quando un'operazione di ripristino causa la lettura dei flussi di log da parte di KTM o quando un'operazione di rollback fa sì che i gestori delle risorse leggano i flussi di log, il ripristino o il rollback si basa sui flussi di log sincronizzati.

Come modificare i valori dell'orologio virtuale

I gestori di risorse possono modificare il valore dell'orologio virtuale passando un nuovo valore a ZwPrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment o ZwSinglePhaseReject.

I gestori delle transazioni superiori possono modificare il valore dell'orologio virtuale passando un nuovo valore a ZwPrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment o ZwReadOnlyEnlistment.

Inoltre, un gestore delle risorse o un gestore transazioni superiore che usa una routine di callback ResourceManagerNotification può modificare il valore dell'orologio virtuale ricevuto dalla routine di callback. KTM salva quindi il valore aggiornato.

Se un gestore di risorse o un gestore transazioni superiore passa un nuovo valore di clock a KTM, KTM salva il nuovo valore solo se è maggiore del valore di clock corrente. In caso contrario, KTM mantiene il valore di clock corrente.

I gestori di risorse e i gestori di transazioni superiori possono ottenere il valore dell'orologio virtuale di un oggetto di gestione transazioni chiamando la routine ZwQueryInformationTransactionManager .