Considerações de programação para NTFS transacional

Para obter uma descrição de várias considerações de programação para o NTFS Transacional, consulte as seguintes seções:

Quais alterações de arquivo são transacionadas

A maioria das alterações de arquivo, como alterações no conteúdo do arquivo, fluxos, pontos de nova análise, atributos e o namespace do sistema de arquivos, são transacionadas. Quando uma dessas alterações é feita em um identificador de arquivo transacionado, a alteração é isolada de outras transações e a alteração é desfeita se a transação for revertida.

As alterações que não afetam o conteúdo do arquivo, os metadados ou o namespace do sistema de arquivos, como alterações na compactação ou desfragmentação, não são transacionadas. Essas alterações não são isoladas de outras transações e não são desfeitas se a transação for revertida.

Compactação

O estado de compactação de um arquivo aberto em uma transação não pode ser alterado.

Criando um arquivo ou diretório

Um arquivo ou diretório criado em uma transação não é visível para nada fora da transação atual. Fora dessa transação, qualquer tentativa de criar um arquivo com o mesmo nome falha com o erro ERROR_TRANSACTIONAL_CONFLICT, reservando efetivamente o nome do arquivo para quando a transação for confirmada ou revertida.

Excluindo um arquivo

Um arquivo ou diretório excluído chamando a função DeleteFileTransacted permanece visível para todos os leitores externos.

Observação

Todos os identificadores transacionados para o arquivo devem ser fechados antes do final da transação. Se os identificadores não estiverem corretamente fechados, a exclusão não ocorrerá. Todos os identificadores abertos para o arquivo devem ser fechados antes de executar o commit para que a operação de exclusão seja considerada parte da transação. Isso ocorre porque o sistema não exclui um arquivo até que o último identificador para ele seja fechado, mesmo quando a operação não for transacionada, como parte do subsistema de E/S de arquivo do Windows.

Excluindo um diretório

Um diretório excluído chamando a função RemoveDirectoryTransacted permanece visível para todos os leitores externos.

Observação

As mesmas restrições existem para identificadores abertos em operações de diretório transacionadas como em arquivos. Para obter mais informações, consulte Excluindo um arquivo.

Problemas de bloqueio de diretório

Se um arquivo for modificado em uma transação, todos os componentes de diretório do caminho para o arquivo serão chamados de fixados em renomeação até que a transação termine. Ou seja, o sistema impede que você os renomee até que a transação seja confirmada ou revertida. Uma tentativa de renomear um diretório que é um ancestral para um arquivo que foi modificado em uma transação em andamento falhará com o erro ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Enumeração de Diretório

O conteúdo de um diretório pode ser alterado enquanto uma enumeração está em andamento como resultado do uso de APIs que enumeram, por exemplo, as funções FindFirstFileTransacted e FindNextFile .

As alterações em um diretório fora de uma transação não são isoladas da transação e são imediatamente visíveis dentro da transação. Por exemplo, se um gravador não transacionado adicionar um arquivo a um diretório, o novo arquivo ficará imediatamente visível dentro da transação de modo que chamar a função FindFirstFileTransacted ou FindNextFile retornará o novo arquivo.

As alterações feitas em um diretório dentro de uma transação são isoladas até que a transação seja confirmada. Por exemplo, um arquivo criado no diretório como parte da transação. Um leitor não transacionado que chama a função FindFirstFile ou FindNextFile não verá o arquivo recém-criado até que a transação seja confirmada.

Arquivos mapeados na memória

O cliente deve chamar a função FlushViewOfFile , fechar o objeto de mapeamento de arquivo e fechar o identificador de arquivo antes de confirmar a transação associada em um arquivo mapeado pela memória.

Fluxos nomeados

Os fluxos nomeados são totalmente transacionais, mas o bloqueio é feito no nível do arquivo, não no nível do fluxo. Gravadores de fora de uma transação que tentam modificar qualquer fluxo dentro de um arquivo bloqueado recebem o erro ERROR_SHARING_VIOLATION.

Não é possível renomear um fluxo secundário em uma transação.

Renomeando um arquivo ou diretório

Para renomear um arquivo como uma operação transacionada, chame MoveFileTransacted para mover o arquivo.

Pontos de reanálise

As alterações nos pontos de nova análise são transacionadas, o que significa que, se um novo ponto de nova análise for atribuído a um arquivo em uma transação, ele não ficará visível para as outras transações. Da mesma forma, as alterações ou a remoção de um ponto de nova análise existente não são visíveis até a confirmação.

Códigos de erro

O KTM (Kernel Transaction Manager) usa os códigos de erro do sistema no intervalo de 6700 a 6799. O TxFS (Transactional NTFS) usa códigos de erro do Windows no intervalo de 6800 a 6899. Para obter mais informações, consulte WinError.h e Códigos de erro do sistema (6000-8199).

Sistema de arquivos criptografado

O TxF não dá suporte a operações em arquivos EFS. Não é possível abrir um arquivo criptografado por EFS para transações. Chamar a função CreateFileTransacted em um arquivo EFS falhará com o erro ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Da mesma forma, chamar a função EncryptFile em um arquivo em uma transação falhará com o erro ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Funções de E/S de arquivo e NTFS transacional

O TxF fornece novas funções transacionadas que levam um nome de arquivo e altera o comportamento das funções de API de E/S de arquivo existentes que tomam um identificador de arquivo.

Funções transacionadas

Se você não chamar uma das seguintes funções transacionadas no lugar de sua versão não transacionada, a operação não será transacionada:

Por exemplo, a função CreateFile agora tem uma versão transacionada: CreateFileTransacted.

Funções de E/S de arquivo alteradas por TxF

A tabela a seguir lista as funções cujo comportamento é afetado pelo NTFS transacional. Por exemplo, o comportamento da função ReadFile variará dependendo se o parâmetro hFile foi criado pela função CreateFile ou pela função CreateFileTransacted .

Função Descrição
Closehandle
Os aplicativos devem fechar todos os identificadores associados a uma transação antes que a transação seja confirmada. Um aplicativo deve fechar um identificador transacionado aberto com FILE_FLAG_DELETE_ON_CLOSE antes de confirmar a transação para que a operação de exclusão ocorra.
Createfilemapping
Se houver uma transação associada ao hFile, o objeto de mapeamento de arquivo que essa função cria será associado à mesma transação. Modificações feitas por meio de exibições desse objeto de mapeamento de arquivo são transacionadas. Os aplicativos devem chamar FlushViewOfFile, desmarcar todos os modos de exibição e fechar todos os identificadores para o objeto de mapeamento de arquivo antes de confirmar alterações transacionadas.
Findnextfile
Se houver uma transação associada ao identificador de enumeração de arquivo, os arquivos retornados estarão sujeitos a regras de isolamento de transação.
FSCTL_SET_COMPRESSION
Não é possível alterar o estado de compactação de um arquivo aberto por CreateFileTransacted.
GetFileInformationByHandle e GetFileInformationByHandleEx
Se houver uma transação associada ao identificador de arquivo, a função retornará informações para a exibição de arquivo isolado.
GetFileSize e GetFileSizeEx
Se houver uma transação associada ao identificador de arquivo, a função retornará informações para a exibição de arquivo isolado.
GetVolumeInformation
Se o volume der suporte a transações do sistema de arquivos, a função retornará FILE_SUPPORTS_TRANSACTIONS em lpFileSystemFlags.
MapViewOfFile e MapViewOfFileEx
Se houver uma transação associada ao identificador de arquivo usado para criar o objeto de mapeamento de arquivo que está sendo mapeado, a exibição associada será transacionada. Se a exibição for usada para fazer alterações transacionadas em um arquivo, o usuário deverá chamar FlushViewOfFile, fechar o objeto de mapeamento de arquivo e fechar o identificador de arquivo antes de confirmar a transação associada.
ReadDirectoryChangesW
Se houver uma transação associada ao identificador de diretório, as notificações refletirão a exibição isolada do diretório. As alterações em arquivos fora da exibição transacionada do diretório não estão incluídas nas notificações.
ReadFile, ReadFileEx e ReadFileScatter
Se houver uma transação associada ao identificador de arquivo, a função retornará dados da exibição transacionada do arquivo. É garantido que um identificador de leitura transacionado mostre a mesma exibição de um arquivo durante a duração do identificador.
Setendoffile
Se houver uma transação associada ao identificador, a alteração na posição de fim do arquivo será transacionada.
SetFileInformationByHandle
Se houver uma transação associada ao identificador, as alterações feitas serão transacionadas para as classes de informações FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo e FileDispositionInfo.
SetFileShortName
Se houver uma transação associada ao identificador, a alteração no nome curto do arquivo será transacionada.
SetFileTime
Se houver uma transação associada ao identificador, a alteração no tempo do arquivo será transacionada.
WriteFile, WriteFileEx e WriteFileGather
Se houver uma transação associada ao identificador de arquivo, a gravação do arquivo será transacionada.