KTM에서 로그 스트림 사용
KTM 기반 TPS(트랜잭션 처리 시스템)는 CLFS( Common Log File System )를 사용하여 트랜잭션 작업을 기록해야 합니다. KTM은 각 트랜잭션 관리자 개체에 대한 로그 스트림을 만듭니다. 각 리소스 관리자는 자체 로그 스트림을 만들어야 합니다.
Transaction Manager 개체에 대한 로그 스트림 만들기
리소스 관리자가 ZwCreateTransactionManager를 호출하는 경우 CLFS 로그 스트림의 이름을 지정해야 합니다. 지정된 스트림이 없으면 KTM이 만듭니다. 스트림이 이미 있는 경우 ZwCreateTransactionManager 가 다시 엽니다. KTM은 이 로그 스트림을 트랜잭션 관리자 개체에 할당합니다.
KTM은 트랜잭션 관리자 개체의 로그 스트림을 사용하여 트랜잭션 관리자 개체 및 트랜잭션 관리자 개체와 연결된 모든 리소스 관리자 개체, 트랜잭션 개체 및 인리스트먼트 개체에 대한 내부 상태 정보를 기록합니다. 트랜잭션 작업이 완료되기 전에 중단된 경우 KTM은 로그의 정보를 사용하여 트랜잭션을 커밋할지 롤백할지 여부를 결정할 수 있습니다.
KTM은 리소스 관리자가 클라이언트에서 수신하거나 클라이언트로 보내는 트랜잭션 데이터를 기록하지 않습니다. 리소스 관리자는 이 정보를 기록하기 위해 자체 로그 스트림을 사용해야 합니다.
리소스 관리자는 ZwQueryInformationTransactionManager 를 호출하여 로그 스트림의 경로 이름 또는 KTM이 스트림에 할당하는 GUID와 같은 트랜잭션 관리자 개체의 로그 스트림에 대한 정보를 가져올 수 있습니다.
리소스 관리자를 위한 로그 스트림 만들기
초기화 코드에서 각 리소스 관리자는 ClfsCreateLogFile 을 호출하여 자체 로그 스트림을 만들어야 합니다. 각 리소스 관리자는 스트림을 사용하여 트랜잭션 데이터를 커밋, 롤백 또는 복구하는 데 필요한 트랜잭션에 대한 모든 정보를 기록해야 합니다.
KTM 및 TPS의 모든 리소스 관리자는 단일 로그 파일을 사용할 수 있지만 각 TPS 구성 요소는 로그 파일 내에서 다른 스트림을 사용해야 합니다. 로그 파일 내에서 개별 스트림을 지정하는 방법에 대한 자세한 내용은 ClfsCreateLogFile을 참조하세요.
KTM은 주기적으로 트랜잭션 관리자의 로그 스트림에 다시 시작 영역을 만듭니다. KTM이 복구 작업을 수행할 때 시스템이 종료되기 전에 열린 개체의 상태를 복구하기 위해 마지막 다시 시작 영역을 읽습니다. 마찬가지로 리소스 관리자는 로그 스트림에서 주기적으로 다시 시작 영역을 만들어야 합니다. 예를 들어 리소스 관리자는 트랜잭션 작업이 완료될 때마다 다시 시작 영역을 만들 수 있습니다.
CLFS 로그 스트림의 다시 시작 영역에 대한 자세한 내용은 CLFS 스트림에서 레코드 다시 시작 읽기를 참조하세요. 또한 ClfsWriteRestartArea, ClfsReadRestartArea 및 ClfsReadPreviousRestartArea 루틴을 참조하세요.
복구에 로그 스트림 사용
리소스 관리자가 ZwCreateTransactionManager를 호출한 후 ZwRecoverTransactionManager를 호출해야 합니다. ZwRecoverTransactionManager 루틴은 트랜잭션 관리자 개체의 로그 스트림을 읽고 TPS의 상태를 알려진 양호한 지점으로 복구합니다. 리소스 관리자가 마지막으로 로드된 후 컴퓨터가 제대로 종료되었거나 종료되지 않은 경우 로그 스트림에는 최소한의 정보가 포함됩니다. 시스템 크래시가 발생한 경우 로그 스트림에는 모든 트랜잭션을 알려진 상태로 복원하기에 충분한 복구 정보가 포함됩니다.
리소스 관리자가 ZwCreateResourceManager를 호출한 후 ZwRecoverResourceManager를 호출해야 합니다. ZwRecoverResourceManager 루틴은 각 리소스 관리자의 인리스트먼트와 연결된 트랜잭션을 복구하려고 합니다. 리소스 관리자의 트랜잭션을 복구하는 방법에 대한 자세한 내용은 복구 작업 처리를 참조하세요.
트랜잭션 데이터 저장
CLFS 로그 스트림을 사용하는 리소스 관리자는 트랜잭션 데이터를 CLFS 마샬링 영역에 저장해야 합니다. CLFS는 로그 스트림의 마샬링 영역에서 영구 스토리지 매체로 데이터를 주기적으로 이동합니다. 데이터를 수정하는 작업을 기록하기 위해 리소스 관리자는 다음을 수행할 수 있습니다.
쓰기 작업에서 수정하기 전에 원래 데이터를 마샬링 영역으로 복사합니다.
데이터베이스의 영구 스토리지 매체를 수정하지 않고 데이터 복사본에 대한 작업을 수행합니다.
새 데이터를 마샬링 영역에 복사합니다.
리소스 관리자가 롤백 알림을 받으면 로그 스트림에서 원래 데이터를 복원할 수 있습니다. 커밋 알림을 받으면 리소스 관리자는 수정된 데이터를 로그 스트림에서 데이터베이스의 영구 스토리지 매체로 복사할 수 있습니다.
리소스 관리자는 ZwSetInformationEnlistment 루틴을 사용하여 복구 정보를 인리스트먼트 개체에 저장할 수도 있습니다. KTM은 이 정보를 로그 스트림에 저장하고 복구 작업 중에 로그 스트림에서 읽습니다. 따라서 리소스 관리자는 ZwQueryInformationEnlistment를 호출하여 언제든지 이 복구 정보를 가져올 수 있습니다.