Gestione delle operazioni di ripristino
In un'operazione di ripristino , un sistema di elaborazione delle transazioni tenta di ripristinare lo stato dalle informazioni contenute nei flussi di log. Al termine di un'operazione di ripristino, tutte le transazioni devono trovarsi in uno stato di commit o di rollback e tutti i dati delle risorse devono trovarsi in uno stato valido noto.
A volte un TPS si arresta prima che tutte le transazioni siano state completate. Ad esempio, il sistema operativo potrebbe arrestarsi in modo anomalo. Pertanto, i responsabili delle risorse devono avviare operazioni di ripristino ogni volta che iniziano a essere eseguiti. L'operazione di ripristino tenta di determinare se le transazioni sono incomplete. Se nel log vengono trovate transazioni incomplete, l'operazione di ripristino tenta di eseguire il commit o il rollback di tali transazioni.
Per un TPS basato su KTM, ogni operazione di ripristino è costituita da due passaggi. Il primo passaggio prevede il ripristino delle informazioni dal flusso di log dell'oggetto di Gestione transazioni. Il secondo passaggio prevede il ripristino delle informazioni dal flusso di log di Resource Manager.
Un TPS può essere ripristinato alla fine di tutti i flussi di log o, se i responsabili delle risorse mantengono valori di orologio virtuale, può ripristinare fino a un valore di orologio specificato.
Recupero di informazioni da un flusso di log di Un oggetto Transaction Manager
Immediatamente dopo che un resource manager chiama ZwCreateTransactionManager o ZwOpenTransactionManager, deve chiamare ZwRecoverTransactionManager. La routine ZwRecoverTransactionManager legge il flusso di log appartenente all'oggetto transaction manager. Questa routine ricostruisce lo stato dell'oggetto gestione transazioni (incluse tutte le transazioni, gli elenchi e i gestori risorse) dalle informazioni di ripristino presenti nel flusso di log, a partire dall'ultima area di riavvio creata da KTM e termina alla fine del flusso.
Per eseguire il ripristino dall'ultima area di riavvio fino a un valore di orologio virtuale specificato, il gestore risorse può chiamare ZwRollforwardTransactionManager anziché ZwRecoverTransactionManager.
Recupero di informazioni da un flusso di log di Resource Manager
Immediatamente dopo che un resource manager chiama ZwCreateResourceManager o ZwOpenResourceManager, deve chiamare ZwRecoverResourceManager. La routine ZwRecoverResourceManager tenta di recuperare le transazioni associate a ogni elenco di resource manager.
Quando un gestore risorse chiama ZwRecoverResourceManager, KTM invia notifiche TRANSACTION_NOTIFY_RECOVER per ogni elenco di Resource Manager. Il gestore risorse deve chiamare ZwRecoverEnlistment ogni volta che riceve una delle notifiche di TRANSACTION_NOTIFY_RECOVER.
Quando il gestore risorse chiama ZwRecoverEnlistment, KTM invia una delle notifiche seguenti:
TRANSACTION_NOTIFY_COMMIT
Gestione risorse deve usare le informazioni nel flusso di log per eseguire il commit della transazione e quindi deve chiamare ZwCommitComplete.
TRANSACTION_NOTIFY_ROLLBACK
Gestione risorse deve usare le informazioni nel flusso di log per eseguire il rollback della transazione e quindi chiamare ZwRollbackComplete.
TRANSACTION_NOTIFY_INDOUBT
KTM non ha determinato lo stato della transazione e invierà una notifica di commit o rollback in un secondo momento.
In genere, KTM invia una notifica TRANSACTION_NOTIFY_COMMIT se determina che tutti i responsabili delle risorse denominati ZwPrepareComplete prima dell'arresto e del riavvio di TPS. KTM invia una notifica di TRANSACTION_NOTIFY_ROLLBACK se determina che uno o più gestori risorse non hanno chiamato ZwPrepareComplete.
Dopo che KTM ha inviato una notifica di TRANSACTION_NOTIFY_RECOVER per ogni inserimento, invia una notifica TRANSACTION_NOTIFY_LAST_RECOVER.
Se il gestore risorse denominato ZwRollforwardTransactionManager anziché ZwRecoverTransactionManager, deve ripristinare solo il valore dell'orologio virtuale specificato in ZwRollforwardTransactionManager.
I responsabili delle risorse possono chiamare ZwSetInformationEnlistment per impostare informazioni di ripristino personalizzate. KTM salva queste informazioni e la scrive nel flusso di log, ma KTM non tenta di interpretare le informazioni. Gestione risorse può recuperare le informazioni di ripristino in qualsiasi momento chiamando ZwQueryInformationEnlistment.
I responsabili delle transazioni superiori a volte ricevono notifiche TRANSACTION_NOTIFY_RECOVER_QUERY durante un'operazione di ripristino.