다음을 통해 공유


가상 클록 값 사용

KTM은 각 트랜잭션 관리자 개체에 대한 가상 클록을 제공합니다. 리소스 관리자가 ZwCreateTransactionManager를 호출하면 KTM은 개체의 가상 클록 값을 1로 설정합니다. KTM은 커밋 작업이 시작될 때마다 가상 클록 값을 증분합니다. KTM이 로그 스트림에 쓸 때마다 로그 레코드에 현재 가상 클록 값이 포함됩니다.

리소스 관리자가 ZwRecoverTransactionManager를 호출하면 KTM은 스트림의 끝까지 로그 스트림 레코드를 읽고 트랜잭션 관리자 개체의 가상 클록 값을 개체의 로그 스트림에서 찾은 마지막 값으로 설정합니다.

리소스 관리자가 ZwRollforwardTransactionManager를 호출하면 KTM은 지정된 클록 값까지 로그 스트림 레코드를 읽고 트랜잭션 관리자 개체의 가상 클록 값을 지정된 클록 값으로 설정합니다.

KTM을 사용하면 리소스 관리자와 우수한 트랜잭션 관리자가 트랜잭션 관리자 개체의 가상 클록 값을 수정할 수 있지만 일반적으로 클록 값을 수정할 필요는 없습니다.

가상 클록 값을 수정하는 경우

일반적으로 TPS(트랜잭션 처리 시스템)는 TPS의 구성 요소가 여러 로그 스트림을 동기화하려고 하지 않는 한 가상 클록 값을 수정할 필요가 없습니다.

예를 들어 TPS에 사전 준비/준비/커밋 시퀀스 중에 서로 통신하는 여러 리소스 관리자가 포함되어 있다고 가정합니다. 또한 각 리소스 관리자가 고유한 로그 스트림이 있는 트랜잭션 관리자 개체를 만든다고 가정합니다. KTM이 복구 작업 중에 모든 리소스 관리자의 상태를 동일한 시점으로 복원하도록 하기 위해 이러한 리소스 관리자는 다음 단계를 사용할 수 있습니다.

  • 한 리소스 관리자가 다른 리소스 관리자와 통신하면 KTM 또는 다른 리소스 관리자로부터 받은 가장 최근의 가상 클록 값을 전달합니다.

  • 리소스 관리자가 가상 클록 값을 허용하는 KTM 루틴을 호출할 때마다(이 항목의 다음 섹션 참조) KTM 또는 다른 리소스 관리자로부터 받은 가장 높은 클록 값을 전달합니다.

  • 각 리소스 관리자는 가상 클록 값을 로그 스트림에 쓰고 롤백 또는 복구 작업을 수행할 때 해당 값을 사용합니다.

이러한 단계를 수행하면 각 트랜잭션 관리자 개체에 대해 KTM이 저장하는 가상 클록 값이 거의 또는 정확히 일치합니다. 따라서 복구 작업으로 인해 KTM이 로그 스트림을 읽도록 하거나 롤백 작업으로 인해 리소스 관리자가 로그 스트림을 읽는 경우 복구 또는 롤백은 동기화된 로그 스트림을 기반으로 합니다.

가상 클록 값을 수정하는 방법

리소스 관리자는 ZwPrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment 또는 ZwSinglePhaseReject에 새 값을 전달하여 가상 클록 값을 수정할 수 있습니다.

우수한 트랜잭션 관리자는ZwPrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment 또는 ZwReadOnlyEnlistment에 새 값을 전달하여 가상 클록 값을 수정할 수 있습니다.

또한 ResourceManagerNotification 콜백 루틴을 사용하는 리소스 관리자 또는 우수한 트랜잭션 관리자는 콜백 루틴이 수신하는 가상 클록 값을 수정할 수 있습니다. 그런 다음 KTM은 업데이트된 값을 저장합니다.

리소스 관리자 또는 우수한 트랜잭션 관리자가 새 클록 값을 KTM에 전달하는 경우 KTM은 현재 클록 값보다 큰 경우에만 새 값을 저장합니다. 그렇지 않으면 KTM은 현재 클록 값을 유지합니다.

리소스 관리자와 우수한 트랜잭션 관리자는 ZwQueryInformationTransactionManager 루틴을 호출하여 트랜잭션 관리자 개체의 가상 클록 값을 가져올 수 있습니다.