Condividi tramite


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, come modifiche al contenuto del file, ai flussi, ai punti di reparse, agli attributi e allo spazio dei nomi del file system, avviene tramite transazioni. 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, 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

Impossibile 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 a nulla all'esterno della transazione corrente. All'esterno di questa transazione, qualsiasi tentativo di creare un file con lo stesso nome ha esito negativo con l'errore ERROR_TRANSACTIONAL_CONFLICT, riservando effettivamente il nome del file quando la transazione esegue il commit o viene eseguito il rollback.

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, la cancellazione non avviene. Tutti gli handle aperti sul file devono essere chiusi prima di eseguire il commit affinché l'operazione di eliminazione sia 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 è soggetta a transazione, come parte del sottosistema I/O di file di 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 sono bloccati contro la rinomina 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 antenato di un file che è stato modificato durante una transazione in corso avrà esito negativo con l'errore ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Esplorazione 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 al FindFirstFileTransacted o alla funzione 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 , funzione FindNextFile, non visualizzerà il file appena creato fino al consolidamento della transazione.

Memory-Mapped file

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. Gli utenti esterni a 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.

Reparse Points

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

Codici di errore

Kernel Transaction Manager (KTM) usa i codici di errore di sistema compresi nell'intervallo compreso tra 6700 e 6799. NTFS transazionale (TxF) usa codici di errore di Windows compresi nell'intervallo compreso tra 6800 e 6899. Per altre informazioni, vedere Codici errore di sistema e WinError.h (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 diCreateFileTransactedin un file EFS avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Analogamente, la chiamata alla funzione EncryptFile su un file in una transazione avrà esito negativo con l'errore ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Funzioni di I/O dei file e NTFS transazionale

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

Funzioni transazionate

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

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

Funzioni di I/O dei file modificate da TxF

Nella tabella seguente sono elencate le funzioni il cui comportamento è interessato da NTFS transazionale. Ad esempio, il comportamento della funzioneReadFilevaria a seconda che il parametro hFile sia stato creato dalla funzioneCreateFileo 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 affinché l'operazione di eliminazione venga eseguita.
CreateFileMapping
Se è presente una transazione associata a hFile, l'oggetto di mapping di file creato da questa funzione verrà associato alla stessa transazione. Le modifiche apportate tramite le viste di questo oggetto di mapping di file vengono transazionate. Le applicazioni devono chiamare FlushViewOfFile, annullare il mapping di tutte le viste 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 a 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 di file system, la funzione restituisce FILE_SUPPORTS_TRANSACTIONS in lpFileSystemFlags.
MapViewOfFile e MapViewOfFileEx
Se esiste una transazione associata all'handle di file utilizzato per creare l'oggetto di mapping del file, allora anche la vista associata è transazionata. Se la vista viene usata per apportare modifiche transazionali a un file, l'utente deve chiamare FlushViewOfFile, chiudere l'oggetto di mappatura del file e chiudere l'handle del 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, ReadFileExe 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 visione di un file per tutta la durata dell'handle.
SetEndOfFile
Se è presente una transazione associata all'handle, viene eseguita la modifica nella posizione di fine del file.
SetFileInformationByHandle
Se è presente una transazione associata all'handle, le modifiche apportate verranno transazionate per le classi di informazioni FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfoe FileDispositionInfo.
ImpostaNomeBreveFile
Se è presente una transazione associata all'handle, viene eseguita la modifica nel nome breve del file.
SetFileTime
Se è presente una transazione associata all'handle, la modifica dell'ora del file viene eseguita in modo transazionale.
WriteFile, WriteFileExe WriteFileGather
Se è presente una transazione associata all'handle di file, viene eseguita la transazione di scrittura del file.