복구 작업 처리

복구 작업에서 TPS(트랜잭션 처리 시스템)는 로그 스트림에 있는 정보에서 상태를 복구하려고 시도합니다. 복구 작업이 완료되면 모든 트랜잭션이 커밋되거나 롤백된 상태여야 하며 모든 리소스 데이터가 알려진 양수 상태여야 합니다.

모든 트랜잭션이 완료되기 전에 TPS가 중지되는 경우가 있습니다. 예를 들어 운영 체제가 충돌할 수 있습니다. 따라서 리소스 관리자는 실행을 시작할 때마다 복구 작업을 시작해야 합니다. 복구 작업은 트랜잭션이 불완전한지 여부를 확인하려고 시도합니다. 불완전한 트랜잭션이 로그에 있는 경우 복구 작업은 해당 트랜잭션을 커밋하거나 롤백하려고 시도합니다.

KTM 기반 TPS의 경우 각 복구 작업은 두 단계로 구성됩니다. 첫 번째 단계는 트랜잭션 관리자 개체의 로그 스트림에서 정보를 복구하는 것입니다. 두 번째 단계는 리소스 관리자의 로그 스트림에서 정보를 복구하는 것입니다.

TPS는 모든 로그 스트림의 끝으로 복구하거나 리소스 관리자가 가상 클록 값을 유지 관리하는 경우 지정된 클록 값까지 복구할 수 있습니다.

Transaction Manager 개체의 로그 스트림에서 정보 복구

리소스 관리자가 ZwCreateTransactionManager 또는 ZwOpenTransactionManager를 호출한 직후 ZwRecoverTransactionManager를 호출해야 합니다. ZwRecoverTransactionManager 루틴은 트랜잭션 관리자 개체에 속하는 로그 스트림을 읽습니다. 이 루틴은 KTM이 만들고 스트림의 끝에서 끝나는 마지막 다시 시작 영역에서 시작하여 로그 스트림에 있는 복구 정보에서 트랜잭션 관리자 개체(모든 트랜잭션, 인리스트먼트 및 리소스 관리자 포함)의 상태를 다시 구성합니다.

마지막 다시 시작 영역에서 지정된 가상 클록 값까지 복구하기 위해 리소스 관리자는 ZwRecoverTransactionManager 대신 ZwRollforwardTransactionManager를 호출할 수 있습니다.

Resource Manager 로그 스트림에서 정보 복구

리소스 관리자가 ZwCreateResourceManager 또는 ZwOpenResourceManager를 호출한 직후 ZwRecoverResourceManager를 호출해야 합니다. ZwRecoverResourceManager 루틴은 각 리소스 관리자의 인리스트먼트와 연결된 트랜잭션을 복구하려고 합니다.

리소스 관리자가 ZwRecoverResourceManager를 호출하면 KTM은 각 리소스 관리자의 인리스트먼트에 대한 TRANSACTION_NOTIFY_RECOVER 알림을 보냅니다. 리소스 관리자는 TRANSACTION_NOTIFY_RECOVER 알림 중 하나를 받을 때마다 ZwRecoverEnlistment 를 호출해야 합니다.

리소스 관리자가 ZwRecoverEnlistment를 호출하면 KTM은 다음 알림 중 하나를 보냅니다.

  • TRANSACTION_NOTIFY_COMMIT

    리소스 관리자는 로그 스트림의 정보를 사용하여 트랜잭션을 커밋한 다음 ZwCommitComplete를 호출해야 합니다.

  • TRANSACTION_NOTIFY_ROLLBACK

    리소스 관리자는 로그 스트림의 정보를 사용하여 트랜잭션을 롤백한 다음 ZwRollbackComplete를 호출해야 합니다.

  • TRANSACTION_NOTIFY_INDOUBT

    KTM은 트랜잭션 상태를 결정하지 않았으며 나중에 커밋 또는 롤백 알림을 보냅니다.

일반적으로 KTM은 TPS가 중지되고 다시 시작되기 전에 ZwPrepareComplete 라는 모든 리소스 관리자가 결정하면 TRANSACTION_NOTIFY_COMMIT 알림을 보냅니다. KTM은 하나 이상의 리소스 관리자가 ZwPrepareComplete를 호출하지 않은 것으로 확인되면 TRANSACTION_NOTIFY_ROLLBACK 알림을 보냅니다.

KTM이 각 인리스트먼트에 대한 TRANSACTION_NOTIFY_RECOVER 알림을 보낸 후 TRANSACTION_NOTIFY_LAST_RECOVER 알림을 보냅니다.

리소스 관리자가 ZwRecoverTransactionManager 대신 ZwRollforwardTransactionManager라고 하는 경우 ZwRollforwardTransactionManager에 지정한 가상 클록 값까지만 복구해야 합니다.

리소스 관리자는 ZwSetInformationEnlistment 를 호출하여 사용자 지정된 복구 정보를 설정할 수 있습니다. KTM은 이 정보를 저장하고 로그 스트림에 기록하지만 KTM은 정보를 해석하지 않습니다. 리소스 관리자는 ZwQueryInformationEnlistment를 호출하여 언제든지 복구 정보를 검색할 수 있습니다.

우수한 트랜잭션 관리자는 복구 작업 중에 TRANSACTION_NOTIFY_RECOVER_QUERY 알림을 받는 경우가 있습니다.