Considerazioni sulla programmazione per NTFS transazionale

Per una descrizione delle varie considerazioni di programmazione per NTFS transazionale, vedere le sezioni seguenti:

Quali modifiche ai file vengono transazionate

La maggior parte delle modifiche ai file, ad esempio le modifiche apportate al contenuto del file, ai flussi, ai punti di analisi, agli attributi e allo spazio dei nomi del file system, vengono transazionate. Quando una di queste modifiche viene apportata su un handle di file transazionale, la modifica viene isolata da altre transazioni e la modifica viene annullata se viene eseguito il rollback della transazione.

Le modifiche che non influiscono sul contenuto del file, sui metadati o sullo spazio dei nomi del file system, ad esempio le modifiche alla compressione o alla deframmentazione, non vengono transazionate. Queste modifiche non sono isolate da altre transazioni e non vengono annullate se viene eseguito il rollback della transazione.

Compressione

Non è possibile modificare lo stato di compressione di un file aperto in una transazione.

Creazione di un file o di una directory

Un file o una directory creata in una transazione non è visibile ad alcun elemento esterno alla transazione corrente. All'esterno di questa transazione, qualsiasi tentativo di creazione di un file con lo stesso nome ha esito negativo con l'errore ERROR_TRANSACTIONAL_CONFLICT, riservando in modo efficace il nome del file quando viene eseguito il commit o il rollback della transazione.

Eliminazione di un file

Un file o una directory eliminata chiamando la funzione DeleteFileTransacted rimane visibile a tutti i lettori esterni.

Nota

Tutti gli handle transazionati nel file devono essere chiusi prima della fine della transazione. Se gli handle non sono chiusi correttamente, l'eliminazione non viene eseguita. Tutti gli handle aperti per il file devono essere chiusi 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.

Eliminazione di una directory

Una directory eliminata chiamando la funzione RemoveDirectoryTransacted rimane visibile a tutti i lettori esterni.

Nota

Esistono gli stessi vincoli per gli handle aperti nelle operazioni di directory transazionate come nei file. Per altre informazioni, vedere Eliminazione di un file.

Problemi di blocco della directory

Se un file viene modificato in una transazione, tutti i componenti della directory del percorso del file vengono definiti aggiunti per la ridenominazione fino al termine della transazione. Ovvero, il sistema impedisce di rinominarli finché non viene eseguito il commit o il rollback della transazione. Un tentativo di rinominare una directory che è un predecessore in un file modificato in una transazione in corso avrà esito negativo con l'errore ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Enumerazione directory

Il contenuto di una directory può essere modificato mentre è in corso un'enumerazione in seguito all'uso di API che enumera, ad esempio le funzioni FindFirstFileTransacted e FindNextFile .

Le modifiche apportate a una directory all'esterno di una transazione non sono isolate dalla transazione e sono immediatamente visibili all'interno della transazione. Ad esempio, se un writer non transazionale aggiunge un file a una directory, il nuovo file è immediatamente visibile all'interno della transazione in modo che la chiamata alla funzione FindFirstFileTransacted o FindNextFile restituirà il nuovo file.

Le modifiche apportate a una directory all'interno di una transazione vengono isolate fino al commit della transazione. Ad esempio, un file creato nella directory come parte della transazione. Un lettore non transazionale che chiama la funzione FindFirstFile o FindNextFile non visualizzerà il file appena creato fino al commit della transazione.

File mappati alla memoria

Il client deve chiamare la funzione FlushViewOfFile , chiudere l'oggetto di mapping dei file e chiudere l'handle di file prima di eseguire il commit della transazione associata in un file mappato alla memoria.

Flussi denominati

I flussi denominati sono completamente transazionali, ma il blocco viene eseguito a livello di file, non a livello di flusso. I writer dall'esterno di una transazione che tentano di modificare qualsiasi flusso all'interno di un file bloccato ricevono l'errore ERROR_SHARING_VIOLATION.

Non è possibile rinominare un flusso secondario in una transazione.

Ridenominazione di un file o di una directory

Per rinominare un file come operazione transazionata, chiamare MoveFileTransacted per spostare il file.

Punti di analisi

Le modifiche apportate ai reparse points vengono transazionate, il che significa che se un nuovo punto di analisi viene assegnato a un file in una transazione, non è visibile alle altre transazioni. Analogamente, le modifiche o la rimozione di un punto di ripristino esistente non sono visibili fino al commit.

Codici errore

Kernel Transaction Manager (KTM) usa i codici di errore di sistema nell'intervallo compreso tra 6700 e 6799. NTFS transazionale (TxF) usa i codici di errore di Windows nell'intervallo compreso tra 6800 e 6899. Per altre informazioni, vedere WinError.h e System Error Codes (6000-8199).

File system crittografato

TxF non supporta le operazioni sui file EFS. Non è possibile aprire un file crittografato EFS per le transazioni. La chiamata alla funzione CreateFileTransacted in un file EFS avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Analogamente, la chiamata alla funzione EncryptFile in un file in una transazione avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Funzioni di I/O file e NTFS transazionale

TxF fornisce nuove funzioni transazioni che accettano un nome file e modificano il comportamento delle funzioni API di I/O file esistenti che accettano un handle di file.

Funzioni transazionate

Se non si chiama una delle funzioni transazionate seguenti al posto della relativa versione non transazionata, l'operazione non verrà eseguita:

Ad esempio, la funzione CreateFile ha ora una versione transazionata: CreateFileTransacted.

Funzioni di I/O file modificate da TxF

Nella tabella seguente sono elencate le funzioni il cui comportamento è interessato da NTFS transazionale. Ad esempio, il comportamento della funzione ReadFile varia a seconda che il parametro hFile sia stato creato dalla funzione CreateFile o dalla funzione CreateFileTransacted .

Funzione Descrizione
Closehandle
Le applicazioni devono chiudere tutti gli handle associati a una transazione prima del commit della transazione. Un'applicazione deve chiudere un handle transazionale aperto con FILE_FLAG_DELETE_ON_CLOSE prima di eseguire il commit della transazione per consentire l'esecuzione dell'operazione di eliminazione.
CreateFileMapping
Se è presente una transazione associata a hFile, l'oggetto di mapping file creato da questa funzione verrà associato alla stessa transazione. Le modifiche apportate tramite le visualizzazioni di questo oggetto di mapping di file vengono transazionate. Le applicazioni devono chiamare FlushViewOfFile, annullare il mapping di tutte le visualizzazioni e chiudere tutti gli handle all'oggetto di mapping dei file prima di eseguire il commit delle modifiche transazionate.
Findnextfile
Se è presente una transazione associata all'handle di enumerazione file, i file restituiti sono soggetti alle regole di isolamento delle transazioni.
FSCTL_SET_COMPRESSION
Non è possibile modificare lo stato di compressione di un file aperto da CreateFileTransacted.
GetFileInformationByHandle e GetFileInformationByHandleEx
Se è presente una transazione associata all'handle di file, la funzione restituisce informazioni per la visualizzazione file isolata.
GetFileSize e GetFileSizeEx
Se è presente una transazione associata all'handle di file, la funzione restituisce informazioni per la visualizzazione file isolata.
GetVolumeInformation
Se il volume supporta le transazioni del file system, la funzione restituisce FILE_SUPPORTS_TRANSACTIONS in lpFileSystemFlags.
MapViewOfFile e MapViewOfFileEx
Se è presente una transazione associata all'handle di file utilizzato per creare l'oggetto di mapping di file di cui viene eseguito il mapping, viene eseguita la transazione della vista associata. Se la vista viene usata per apportare modifiche transazioni a un file, l'utente deve chiamare FlushViewOfFile, chiudere l'oggetto di mapping dei file e chiudere l'handle di file prima di eseguire il commit della transazione associata.
ReadDirectoryChangesW
Se è presente una transazione associata all'handle di directory, le notifiche riflettono la visualizzazione isolata della directory. Le modifiche apportate ai file all'esterno della visualizzazione transazionata della directory non sono incluse nelle notifiche.
ReadFile, ReadFileEx e ReadFileScatter
Se è presente una transazione associata all'handle di file, la funzione restituisce i dati dalla vista transazionale del file. È garantito che un handle di lettura transazionato mostri la stessa visualizzazione di un file per la durata dell'handle.
SetEndOfFile
Se è presente una transazione associata all'handle, viene eseguita la modifica nella posizione end-of-file.
SetFileInformationByHandle
Se è presente una transazione associata all'handle, le modifiche apportate verranno transazionate per le classi di informazioni FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo e FileDispositionInfo.
SetFileShortName
Se è presente una transazione associata all'handle, viene eseguita la modifica nel nome breve del file.
SetFileTime
Se è presente una transazione associata all'handle, viene eseguita la modifica in fase di file.
WriteFile, WriteFileEx e WriteFileGather
Se è presente una transazione associata all'handle di file, viene eseguita la transazione di scrittura del file.