Creazione di un client transazionale
Un client transazionale è un componente TPS (Transaction Processing System) che usa l'interfaccia esportata di un gestore risorse per accedere a una risorsa, ad esempio un database, supportato da Resource Manager.
In genere, il client crea una transazione, esegue un set di operazioni di database e quindi esegue il commit della transazione per rendere permanenti le operazioni. Se il client rileva un errore, può eseguire il rollback della transazione per rimuovere le operazioni della transazione anziché eseguire il commit della transazione.
In genere, un client transazionale che usa KTM in modalità kernel deve eseguire le attività seguenti per ogni transazione:
Creare un oggetto transazione.
Una chiamata a ZwCreateTransaction crea un oggetto transazione, fornisce un handle oggetto e assegna un identificatore di oggetto (un GUID) che il client può passare al gestore risorse per identificare la transazione.
Ottenere l'identificatore dell'oggetto transazione.
Il client può chiamare ZwQueryInformationTransaction per ottenere l'identificatore dell'oggetto.
Passare l'identificatore dell'oggetto transazione a un gestore risorse.
Il client chiama in genere l'interfaccia esportata di Resource Manager per aprire un percorso di comunicazione con gestione risorse e associare il percorso alla transazione. Ad esempio, gestione risorse potrebbe fornire una routine CreateDataObject simile a quella descritta dall'argomento Informazioni sui componenti TPS .
Eseguire operazioni da includere nella transazione.
In genere, il client chiama l'interfaccia di Resource Manager per accedere alla risorsa di Resource Manager. Ad esempio, il client di una gestione database potrebbe leggere e scrivere nel database.
Eseguire il commit o il rollback della transazione.
Se tutte le operazioni di risorsa hanno esito positivo, il client deve chiamare ZwCommitTransaction per rendere permanenti le operazioni. Se un'operazione non riesce, il client deve chiamare ZwRollbackTransaction anziché ZwCommitTransaction. Ad esempio, se il client di un gestore di database determina che una di una serie di operazioni di scrittura non è riuscita, il client deve chiamare ZwRollbackTransaction in modo che nessuna delle operazioni di scrittura diventi permanente.
I client possono chiamare ZwCommitTransaction e ZwRollbackTransaction in modo sincrono o asincrono. Se i client chiamano queste routine in modo sincrono, le routine non vengono restituite fino al completamento dell'operazione di commit o rollback.
Per altre informazioni su come eseguire il commit e il rollback delle transazioni, vedere Gestione delle operazioni delle transazioni.
Chiudere l'handle dell'oggetto transazione.
Al termine dell'elaborazione della transazione, il client deve chiamare ZwClose per chiudere l'handle dell'oggetto transazione
Un tps può includere più di un gestore di risorse. Se la transazione di un client include operazioni su più risorse, ad esempio due database supportati da due gestori risorse, il client esegue in genere le operazioni seguenti:
Crea un singolo oggetto transazione per ogni transazione.
Passa l'identificatore dell'oggetto transazione a ogni gestore risorse.
Esegue operazioni su ogni database chiamando l'interfaccia di ogni gestore di risorse.
Esegue il commit della transazione se tutte le operazioni sono state completate senza errori o esegue il rollback della transazione se è stato rilevato un errore.
Se il tps include un gestore transazioni superiore, i client transazionali in genere non chiamano KTM. Per altre informazioni sui gestori delle transazioni superiori e sui relativi client, vedere Creazione di un gestore transazioni superiore.
I client transazionali possono chiamare ZwSetInformationTransaction per impostare informazioni specifiche della transazione. Ad esempio, un client può impostare un valore di timeout per la transazione o fornire una stringa di caratteri descrittiva. I client possono chiamare ZwQueryInformationTransaction per recuperare informazioni su una transazione. Ad esempio, un client può chiamare questa routine per determinare se è stato eseguito il commit o il rollback di una transazione.