트랜잭션 NTFS에 대한 프로그래밍 고려 사항
트랜잭션 NTFS에 대한 다양한 프로그래밍 고려 사항에 대한 설명은 다음 섹션을 참조하세요.
- 트랜잭션되는 파일 변경 내용
- 압축
- 파일 또는 디렉터리 만들기
- 파일 삭제
- 디렉터리 삭제
- 디렉터리 잠금 문제
- 디렉터리 열거형
- 메모리 매핑된 파일
- 명명된 스트림
- 파일 또는 디렉터리 이름 바꾸기
- 구문 재분석 지점
- 오류 코드
- 암호화된 파일 시스템
- 파일 I/O 함수 및 트랜잭션 NTFS
트랜잭션되는 파일 변경 내용
대부분의 파일 변경 내용(예: 파일 콘텐츠, 스트림, 재분석 지점, 특성 및 파일 시스템 네임스페이스에 대한 변경 내용)이 트랜잭션됩니다. 트랜잭션된 파일 핸들에서 이러한 변경 내용 중 하나가 발생하면 변경 내용이 다른 트랜잭션과 격리되고 트랜잭션이 롤백되면 변경 내용이 취소됩니다.
파일 콘텐츠, 메타데이터 또는 파일 시스템 네임스페이스에 영향을 미치지 않는 변경 내용(예: 압축 또는 조각 모음에 대한 변경 내용)은 트랜잭션되지 않습니다. 이러한 변경 내용은 다른 트랜잭션과 격리되지 않으며 트랜잭션이 롤백되더라도 실행 취소되지 않습니다.
압축
트랜잭션에서 열린 파일의 압축 상태는 변경할 수 없습니다.
파일 또는 디렉터리 만들기
트랜잭션에서 생성된 파일 또는 디렉터리는 현재 트랜잭션 외부에서는 볼 수 없습니다. 이 트랜잭션 외부에서, 동일한 이름으로 파일을 생성하려는 모든 시도는 ERROR_TRANSACTIONAL_CONFLICT 오류로 인해 실패하며 트랜잭션이 커밋되거나 롤백될 때 파일 이름을 효과적으로 예약합니다.
파일 삭제
DeleteFileTransacted 함수를 호출하여 삭제된 파일 또는 디렉터리는 모든 외부 판독기에 계속 표시됩니다.
참고
파일에 대한 모든 트랜잭션된 핸들은 트랜잭션이 끝나기 전에 닫아야 합니다. 핸들이 제대로 닫히지 않으면 삭제가 발생하지 않습니다. 제 작업이 트랜잭션의 일부로 간주되려면 커밋을 수행하기 전에 파일에 열려 있는 모든 핸들을 닫아야 합니다. Windows 파일 I/O 하위 시스템의 일부로 작업이 트랜잭션되지 않은 경우에도 마지막 핸들이 닫힐 때까지 시스템이 파일을 실제로 삭제하지 않기 때문입니다.
디렉터리 삭제
RemoveDirectoryTransacted 함수를 호출하여 삭제된 디렉터리는 모든 외부 판독기에 계속 표시됩니다.
참고
파일에서와 같이 트랜잭션된 디렉터리 작업에서 열린 핸들에 대해 동일한 제약 조건이 있습니다. 자세한 내용은 파일 삭제를 참조하세요.
디렉터리 잠금 문제
트랜잭션에서 파일이 수정된 경우 파일 경로의 모든 디렉터리 구성 요소를 트랜잭션이 끝날 때까지 이름 바꾸기에 대해 고정되었다고 합니다. 즉, 트랜잭션이 커밋되거나 롤백될 때까지 시스템은 이름을 바꿀 수 없도록 합니다. 진행 중인 트랜잭션에서 수정된 파일의 상위 디렉터리 이름을 바꾸려는 시도는 ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY 오류로 인해 실패합니다.
디렉터리 열거형
열거하는 API를 사용한 결과(예: FindFirstFileTransacted 및 FindNextFile 함수) 열거가 진행되는 동안 디렉터리의 내용을 변경할 수 있습니다.
트랜잭션 외부의 디렉터리에 대한 변경 내용은 트랜잭션에서 격리되지 않으며 트랜잭션 내에서 즉시 볼 수 있습니다. 예를 들어, 트랜잭션되지 않은 기록기가 파일을 디렉터리에 추가하면 새 파일이 트랜잭션 내부에 즉시 표시되므로 FindFirstFileTransacted 또는 FindNextFile 함수를 호출하면 새 파일이 반환됩니다.
트랜잭션 내의 디렉터리에 대한 변경 내용은 트랜잭션이 커밋될 때까지 격리됩니다. 예를 들어, 트랜잭션의 일부로 디렉터리에 생성된 파일입니다. FindFirstFile 또는 FindNextFile 함수를 호출하는 트랜잭션되지 않은 판독기는 트랜잭션이 커밋될 때까지 새로 생성된 파일을 볼 수 없습니다.
메모리 매핑된 파일
클라이언트는 FlushViewOfFile 함수를 호출하고, 파일 매핑 개체를 닫고, 메모리 매핑된 파일에서 연결된 트랜잭션을 커밋하기 전에 파일 핸들을 닫아야 합니다.
명명된 스트림
명명된 스트림은 완전히 트랜잭션되지만 잠금은 스트림 수준이 아닌 파일 수준에서 수행됩니다. 잠긴 파일 내의 스트림을 수정하려고 시도하는 트랜잭션 외부의 기록기는 ERROR_SHARING_VIOLATION 오류를 받습니다.
트랜잭션에서 보조 스트림의 이름을 바꿀 수 없습니다.
파일 또는 디렉터리 이름 바꾸기
파일 이름을 트랜잭션된 작업으로 바꾸려면 MoveFileTransacted를 호출하여 파일을 이동합니다.
구문 재분석 지점
재분석 지점에 대한 변경 내용은 트랜잭션됩니다. 즉, 새 재분석 지점이 트랜잭션의 파일에 할당되면 다른 트랜잭션에 표시되지 않습니다. 마찬가지로 기존 재분석 지점의 변경 또는 제거는 커밋될 때까지 표시되지 않습니다.
오류 코드
KTM(커널 트랜잭션 관리자)은 6700~6799 범위의 시스템 오류 코드를 사용합니다. TxF(트랜잭션 NTFS)는 6800~6899 범위의 Windows 오류 코드를 사용합니다. 자세한 내용은 WinError.h 및 시스템 오류 코드(6000-8199)를 참조하세요.
암호화된 파일 시스템
TxF는 EFS 파일에 대한 작업을 지원하지 않습니다. 트랜잭션을 위해 EFS로 암호화된 파일을 열 수 없습니다. EFS 파일에서 CreateFileTransacted 함수를 호출하면 ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION 오류로 인해 실패합니다. 마찬가지로 트랜잭션의 파일에서 EncryptFile 함수를 호출하면 ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION 오류로 인해 실패합니다.
파일 I/O 함수 및 트랜잭션 NTFS
TxF는 파일 이름을 사용하는 새 트랜잭션된 함수를 제공하고 파일 핸들을 사용하는 기존 파일 I/O API 함수의 동작을 변경합니다.
트랜잭션된 함수
트랜잭션되지 않은 버전 대신 다음 트랜잭션된 함수 중 하나를 호출하지 않으면 작업이 트랜잭션되지 않습니다.
- CopyFileTransacted
- CreateDirectoryTransacted
- CreateFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- DeleteFileTransacted
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- GetCompressedFileSizeTransacted
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
예를 들어 CreateFile 함수에는 이제 트랜잭션된 버전 CreateFileTransacted가 있습니다.
TxF에 의해 변경된 파일 I/O 함수
다음 표에는 함수의 동작이 트랜잭션 NTFS의 영향을 받는 함수가 나열되어 있습니다. 예를 들어 ReadFile 함수의 동작은 hFile 매개 변수가 CreateFile 함수 또는 CreateFileTransacted 함수에 의해 생성되었는지 여부에 따라 달라집니다.
함수 | 설명 |
---|---|
CloseHandle |
애플리케이션은 트랜잭션이 커밋되기 전에 트랜잭션에 바인딩된 모든 핸들을 닫아야 합니다. 애플리케이션은 트랜잭션을 커밋하기 전에 FILE_FLAG_DELETE_ON_CLOSE로 열린 트랜잭션 핸들을 닫아야 합니다. 그래야 삭제 작업이 발생합니다. |
CreateFileMapping |
hFile과 연결된 트랜잭션이 있는 경우 이 함수가 생성하는 파일 매핑 개체는 동일한 트랜잭션과 연결됩니다. 이 파일 매핑 개체의 뷰를 통해 수정한 내용이 트랜잭션됩니다. 애플리케이션은 트랜잭션된 변경 내용을 커밋하기 전에 FlushViewOfFile을 호출하고, 모든 뷰의 매핑을 해제하고, 파일 매핑 개체에 대한 모든 핸들을 닫아야 합니다. |
FindNextFile |
파일 열거형 핸들에 바인딩된 트랜잭션이 있는 경우 반환되는 파일에 트랜잭션 격리 규칙이 적용됩니다. |
FSCTL_SET_COMPRESSION |
CreateFileTransacted로 연 파일의 압축 상태는 변경할 수 없습니다. |
GetFileInformationByHandle 및 GetFileInformationByHandleEx |
파일 핸들에 바인딩된 트랜잭션이 있는 경우 함수는 격리된 파일 뷰에 대한 정보를 반환합니다. |
GetFileSize 및 GetFileSizeEx |
파일 핸들에 바인딩된 트랜잭션이 있는 경우 함수는 격리된 파일 뷰에 대한 정보를 반환합니다. |
GetVolumeInformation |
볼륨이 파일 시스템 트랜잭션을 지원하면 함수는 lpFileSystemFlags에서 FILE_SUPPORTS_TRANSACTIONS를 반환합니다. |
MapViewOfFile 및 MapViewOfFileEx |
매핑되는 파일 매핑 개체를 만드는 데 사용되는 파일 핸들과 연결된 트랜잭션이 있는 경우에는 연결된 뷰가 트랜잭션됩니다. 뷰를 사용하여 파일에 트랜잭션된 변경 내용을 적용한 경우 사용자는 연결된 트랜잭션을 커밋하기 전에 FlushViewOfFile을 호출하고, 파일 매핑 개체를 닫고, 파일 핸들을 닫아야 합니다. |
ReadDirectoryChangesW |
디렉터리 핸들에 바인딩된 트랜잭션이 있는 경우 알림은 디렉터리의 격리된 뷰를 반영합니다. 디렉터리의 트랜잭션된 뷰 외부에 있는 파일에 대한 변경 내용은 알림에 포함되지 않습니다. |
ReadFile, ReadFileEx 및 ReadFileScatter |
파일 핸들에 바인딩된 트랜잭션이 있는 경우 함수는 파일의 트랜잭션된 뷰에서 데이터를 반환합니다. 트랜잭션된 읽기 핸들은 핸들이 지속되는 동안 파일의 동일한 뷰를 표시하도록 보장됩니다. |
SetEndOfFile |
핸들에 바인딩된 트랜잭션이 있는 경우 파일 끝 위치의 변경 내용이 트랜잭션됩니다. |
SetFileInformationByHandle |
핸들에 바인딩된 트랜잭션이 있는 경우 변경된 내용은 정보 클래스 FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo, FileDispositionInfo에 대해 트랜잭션됩니다. |
SetFileShortName |
핸들에 바인딩된 트랜잭션이 있는 경우 파일의 짧은 이름의 변경 내용이 트랜잭션됩니다. |
SetFileTime |
핸들에 바인딩된 트랜잭션이 있는 경우 파일 시간의 변경 내용이 트랜잭션됩니다. |
WriteFile, WriteFileEx 및 WriteFileGather |
파일 핸들에 바인딩된 트랜잭션이 있는 경우 파일 쓰기가 트랜잭션됩니다. |