트랜잭션 NTFS를 사용하는 방법

거래된 파일 핸들

TxF(트랜잭션 NTFS)는 파일 핸들을 트랜잭션에 바인딩합니다. 핸들(예: ReadFileWriteFile 함수)에서 작동하는 작업의 경우 실제 API 함수 호출은 변경되지 않습니다. 이름을 사용하는 파일 작업의 경우 이러한 작업에 대한 명시적 트랜잭션 함수가 있습니다. 예를 들어 CreateFile을 호출하는 대신 CreateFileTransacted를 호출합니다. 그러면 트랜잭션된 파일 핸들이 만들어지며, 이 핸들은 핸들이 필요한 모든 파일 작업에 사용할 수 있습니다. 이 핸들을 사용하는 모든 후속 작업은 트랜잭션된 작업입니다.

기본 TxF 사용

다음 일련의 단계는 TxF에 대한 가장 기본적인 사용량을 나타냅니다. 애플리케이션 디자이너의 재량에 따라 더 복잡한 시나리오도 지원됩니다.

  1. KTM 함수 CreateTransaction을 호출하거나 DTC(Distributed Transaction Coordinator)의 IKernelTransaction 인터페이스를 사용하여 트랜잭션을 만듭니다.
  2. CreateFileTransacted를 호출하여 트랜잭션된 파일 핸들을 가져옵니다.
  3. 트랜잭션된 파일 핸들을 사용하여 필요에 따라 파일을 수정합니다.
  4. 1단계에서 만든 트랜잭션과 연결된 트랜잭션된 파일 핸들을 모두 닫습니다.
  5. 해당 KTM 또는 DTC 함수를 호출하여 트랜잭션을 커밋하거나 중단합니다.

TxF 프로그래밍 모델의 핵심 사항

TxF 프로그래밍 모델에는 TxF 애플리케이션을 개발할 때 고려해야 할 다음과 같은 주요 사항이 있습니다.

  • 트랜잭션을 커밋하거나 롤백하기 전에 애플리케이션에서 트랜잭션된 파일 핸들을 모두 닫는 것이 좋습니다. 시스템은 트랜잭션이 종료될 때 트랜잭션된 모든 핸들을 무효화합니다. 트랜잭션이 종료된 후 트랜잭션 핸들에서 수행되는 close를 제외한 모든 작업은 다음 오류를 반환합니다. ERROR_HANDLE_NO_LONGER_VALID.
  • 파일은 스토리지 단위로 표시됩니다. 부분 업데이트 및 전체 파일 덮어쓰기가 지원됩니다. 여러 트랜잭션이 동일한 파일을 동시에 수정할 수 없습니다.
  • 메모리 매핑된 I/O는 투명하며 일반 파일 I/O와 일치합니다. 애플리케이션은 트랜잭션을 커밋하기 전에 열린 섹션을 플러시하고 닫아야 합니다. 이렇게 하지 않으면 트랜잭션 내에서 매핑된 파일이 부분적으로 변경될 수 있습니다. 롤백이 수행되지 않으면 실패합니다.

일반적인 프로그래밍 오류

트랜잭션된 애플리케이션을 개발할 때 다음과 같은 일반적인 오류가 발생할 수 있습니다.

  • 트랜잭션이 완료된 후 파일 핸들 사용
  • 트랜잭션을 커밋하기 전에 삭제된 파일 및 디렉터리에 대한 핸들을 닫지 못하면 삭제 작업이 발생하지 않습니다. 이 이벤트는 트랜잭션의 일부로 간주되도록 삭제 작업에 대한 커밋을 수행하기 전에 발생해야 합니다. 이는 작업이 트랜잭션되지 않은 경우에도 Windows 파일 I/O 하위 시스템의 일부로 마지막 핸들이 닫을 때까지 시스템이 실제로 파일을 삭제하지 않기 때문입니다.
  • 언제든지 발생할 수 있는 시스템 시작 트랜잭션 롤백을 고려하지 못했습니다. 예를 들어 시스템 리소스가 소진되면 트랜잭션이 롤백됩니다.