Condividi tramite


Esecuzione del ripristino

In caso di errore delle risorse, la gestione risorse consente di ripristinare le integrazioni durevoli di una transazione mediante la reintegrazione dei partecipanti della transazione.

Descrizione del processo di ripristino

Per eseguire l'integrazione durevole di una risorsa (definita da un'implementazione dell'interfaccia IEnlistmentNotification) che in seguito può essere ripristinata, è necessario chiamare il metodo EnlistDurable. È inoltre necessario fornire al metodo EnlistDurable un identificatore del gestore di risorse (ovvero un oggetto Guid), che viene utilizzato per identificare in modo coerente il partecipante della transazione in caso di errore delle risorse. Per questo motivo, l'oggetto Guid fornito alla chiamata iniziale al metodo Enlist deve corrispondere al parametro resourceManagerIdentifier fornito nella chiamata al metodo Reenlist durante il ripristino. In caso contrario, viene generata un'eccezione TransactionException. Per altre informazioni sulle integrazioni durevoli, vedere Integrazione di risorse come partecipanti a una transazione.

Nella fase di preparazione (fase 1) del protocollo 2PC, l'implementazione del gestore di risorse durevole deve registrare il proprio record di preparazione non appena riceve la notifica di preparazione tramite il metodo Prepare. Il record deve contenere tutte le informazioni necessarie a completare la transazione in caso di commit. Per accedere in un secondo momento al record di preparazione durante il ripristino, è possibile recuperare la proprietà RecoveryInformation del callback preparingEnlistment. Non è necessario eseguire la registrazione del record all'interno del metodo Prepare, in quanto il gestore di risorse può eseguire questa operazione in un thread di lavoro.

Il processo di ripristino è costituito dai due passaggi seguenti:

Passaggio 1: reintegrazione

Il gestore di risorse esamina le informazioni contenute nel record di preparazione di ogni integrazione incerta, ovvero nello stato InDoubt. A tale scopo, esamina la proprietà RecoveryInformation del callback PreparingEnlistment passata durante la fase 1 al gestore di risorse nella notifica basata sul metodo Prepare.

Per ogni integrazione di questo tipo, il gestore di risorse richiama il metodo Reenlist sulla gestione transazioni. Questo metodo passa una matrice di byte contenente l'identificatore univoco Guid del gestore di risorse nonché le informazioni relative all'integrazione. Viene quindi restituito un nuovo oggetto Enlistment. Se la reintegrazione non riesce e viene generata un'eccezione, il gestore di risorse deve provare in seguito a eseguire nuovamente questo passaggio.

Il metodo Reenlist deve essere chiamato soltanto quando un gestore delle risorse viene riavviato dopo un errore. Inoltre, la reintegrazione deve riguardare esclusivamente le transazioni non ripristinate registrate da un gestore di risorse durante la fase iniziale di preparazione di un commit a due fasi. Qualsiasi tentativo di chiamata a questo metodo in casi non validi può produrre risultati imprevisti.

Dopo aver utilizzato questo metodo per reintegrare un partecipante, il sistema chiama il metodo della fase 2 dell'interfaccia IEnlistmentNotification corrispondente al risultato della transazione (ovvero Commit, Rollback o InDoubt).

Passaggio 2: completamento del ripristino

Al termine di tutte le reintegrazioni, il gestore di risorse chiama il metodo RecoveryComplete. Questo metodo consente di completare il ripristino e di comunicare alla gestione transazioni che il gestore di risorse non presenta più alcuna transazione incerta. Ciò consente al gestore di risorse di garantire che non richiamerà più il metodo Reenlist.

Un gestore di risorse può integrarsi in altre transazioni anche se non ha ancora risolto tutte le transazioni incerte. Dopo che il gestore di risorse ha stabilito una relazione con il gestore delle transazioni, il primo passaggio può essere eseguito in qualsiasi momento. Tuttavia, dopo aver richiamato il metodo RecoveryComplete nel passaggio 2, il passaggio 1 non può più essere ripetuto. Il passaggio 2 può essere ripetuto più volte senza che ciò influisca sul risultato delle transazioni.