Come usare NTFS transazionale

Handle file transazionati

NTFS transazionale (TxF) associa un handle di file a una transazione. Per le operazioni che funzionano su un handle (ad esempio, le funzioni ReadFile e WriteFile), la chiamata effettiva della funzione API non cambia. Per le operazioni di file che accettano un nome, sono disponibili funzioni transazionate esplicite per queste operazioni. Ad esempio, anziché chiamare CreateFile, chiamare CreateFileTransacted. In questo modo viene creato un handle di file transazionato, che può quindi essere usato per tutte le operazioni di file che richiedono un handle. Tutte le operazioni successive che usano questo handle sono operazioni transazionate.

Utilizzo txF di base

La serie di passaggi seguente rappresenta l'utilizzo più di base per TxF. Sono supportati anche scenari più complessi, a discrezione della finestra di progettazione applicazioni.

  1. Creare una transazione chiamando la funzione KTM CreateTransaction o usando l'interfaccia IKernelTransaction di Distributed Transaction Coordinator (DTC).
  2. Ottenere handle file transazionati chiamando CreateFileTransacted.
  3. Modificare i file in base alle esigenze usando gli handle di file transazionati.
  4. Chiudere tutti gli handle di file transazionati associati alla transazione creata nel passaggio 1.
  5. Eseguire il commit o l'interruzione della transazione chiamando la funzione KTM o DTC corrispondente.

Punti chiave del modello di programmazione TxF

Il modello di programmazione TxF include i punti chiave seguenti da considerare quando si sviluppa un'applicazione TxF:

  • È consigliabile chiudere tutti gli handle di file transazionati prima di eseguire il commit o il rollback di una transazione. Il sistema invalida tutti gli handle transazionati al termine di una transazione. Qualsiasi operazione, ad eccezione della chiusura, eseguita su un handle transazionato dopo la fine della transazione restituisce l'errore seguente: ERROR_HANDLE_NO_LONGER_VALID.
  • Un file viene visualizzato come unità di archiviazione. Sono supportati aggiornamenti parziali e sovrascrizioni dei file completi. Più transazioni non possono modificare simultaneamente lo stesso file.
  • L'I/O mappato alla memoria è trasparente e coerente con il file di I/O normale. Un'applicazione deve scaricare e chiudere una sezione aperta prima di eseguire il commit di una transazione. Questa operazione può comportare modifiche parziali al file mappato all'interno della transazione. Un rollback ha esito negativo se questa operazione non viene eseguita.

Errori di programmazione comuni

Gli errori comuni seguenti possono verificarsi durante lo sviluppo di applicazioni transazionate:

  • Uso di un handle di file dopo il completamento di una transazione.
  • Impossibile chiudere gli handle per eliminare file e directory prima di eseguire il commit di una transazione, che impedirà l'esecuzione delle operazioni di eliminazione. Questo evento deve verificarsi prima di eseguire il commit per l'operazione di eliminazione da considerare parte della transazione. Ciò avviene perché il sistema non elimina effettivamente un file fino all'ultimo handle da chiudere, anche quando l'operazione non viene eseguita, come parte del sottosistema I/O del file di Windows.
  • Impossibile tenere conto dei rollback delle transazioni avviate dal sistema, che possono verificarsi in qualsiasi momento; ad esempio, una transazione viene eseguito il rollback se le risorse di sistema vengono esaurite.