Come usare NTFS transazionale

Handle di 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 di funzione API effettiva non cambia. Per le operazioni di file che accettano un nome, sono disponibili funzioni transazioni 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ù semplice per TxF. Sono supportati anche scenari più complessi, a discrezione della finestra di progettazione dell'applicazione.

  1. Creare una transazione chiamando la funzione KTM CreateTransaction o usando l'interfaccia IKernelTransaction di Distributed Transaction Coordinator (DTC).
  2. Ottenere handle di file transazioni 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 di close, eseguita su un handle transazionale al termine 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 di file completi. Più transazioni non possono modificare simultaneamente lo stesso file.
  • L'I/O mappato alla memoria è trasparente e coerente con il normale I/O del file. Un'applicazione deve scaricare e chiudere una sezione aperta prima di eseguire il commit di una transazione. In caso contrario, è possibile apportare modifiche parziali al file mappato all'interno della transazione. Se questa operazione non viene eseguita, il rollback ha esito negativo.

Errori di programmazione comuni

Durante lo sviluppo di applicazioni transazionate possono verificarsi gli errori comuni seguenti:

  • Utilizzo di un handle di file dopo il completamento di una transazione.
  • Non è possibile chiudere gli handle per eliminare file e directory prima di eseguire il commit di una transazione, impedendo così l'esecuzione delle operazioni di eliminazione. Questo evento deve verificarsi prima di eseguire il commit affinché l'operazione di eliminazione venga considerata parte della transazione. Ciò è dovuto al fatto che il sistema non elimina effettivamente un file fino a quando non viene chiuso l'ultimo handle, anche quando l'operazione non viene eseguita, come parte del sottosistema di I/O del file Windows.
  • Non è possibile tenere conto dei rollback delle transazioni avviate dal sistema, che possono verificarsi in qualsiasi momento; Ad esempio, viene eseguito il rollback di una transazione se le risorse di sistema vengono esaurite.