우수한 트랜잭션 관리자 만들기
KTM에서 우수한 트랜잭션 관리자는 참여하는 트랜잭션 에 대한 우수한 인리스트먼트를 만드는 리소스 관리자입니다. 우수한 인리스트먼트는 리소스 관리자에게 인리스트먼트 트랜잭션에 대한 커밋 작업을 조정할 수 있는 기능을 부여하는 인리스트먼트입니다. 즉, 트랜잭션 클라이언트 또는 우수한 트랜잭션 관리자는 트랜잭션에 대한 사전 준비/준비/커밋 시퀀스를 시작할 수 있습니다.
리소스 관리자가 트랜잭션에 대한 우수한 인리스트먼트를 만든 후 KTM은 트랜잭션에 대한 ZwCommitTransaction 에 대한 모든 호출을 거부합니다. 따라서 트랜잭션 클라이언트는 이러한 트랜잭션을 커밋할 수 없습니다. 대신 우수한 인리스트먼트를 만든 리소스 관리자는 ZwPrepareEnlistment, ZwPrepareEnlistment 및 ZwCommitEnlistment를 호출해야 합니다.
우수한 트랜잭션 관리자를 만들어야 하는 경우
TPS(트랜잭션 처리 시스템) 구성 요소를 KTM과 통합하려고 하지만 구성 요소에 클라이언트가 호출할 수 있는 자체 비KTM 트랜잭션 관리 기능이 포함되어 있다고 가정합니다. 이러한 상황에서는 우수한 트랜잭션 관리자를 만들어야 할 수 있습니다.
예를 들어 구성 요소가 클라이언트가 트랜잭션을 만들고 커밋하는 데 사용하는 자체 인터페이스를 제공한다고 가정합니다. 구성 요소의 클라이언트는 KTM을 호출하여 트랜잭션을 만들거나 커밋하지 않으므로 구성 요소를 KTM 기반 TPS에 통합할 때 뛰어난 트랜잭션 관리자가 되어야 합니다.
우수한 트랜잭션 관리자를 만드는 방법
구성 요소가 우수한 트랜잭션 관리자가 되려면 다음을 수행해야 합니다.
ZwCreateResourceManager를 호출하여 리소스 관리자로 등록합니다.
구성 요소의 클라이언트가 구성 요소의 클라이언트 인터페이스를 사용하여 트랜잭션을 만들 때마다 ZwCreateTransaction 을 호출합니다.
ZwCreateEnlistment를 호출하고 ENLISTMENT_SUPERIOR 플래그를 설정하고 ENLISTMENT_SUPERIOR_RIGHTS 및 ENLISTMENT_SUBORDINATE_RIGHTS 액세스 플래그를 모두 지정합니다.
구성 요소의 클라이언트가 구성 요소의 클라이언트 인터페이스를 호출하여 트랜잭션을 커밋할 때 ZwPrepareEnlistment, ZwPrepareEnlistment 및 ZwCommitEnlistment를 호출합니다.
KTM은 트랜잭션당 하나의 우수한 인리스트먼트만 허용합니다. 다른 리소스 관리자는 추가 인리스트먼트를 만들 수 있습니다. 이러한 인리스트먼트는 커밋 작업을 시작할 수 없으므로 종속 인리스트먼트 라고 합니다.
우수한 인리스트먼트를 롤백하기 위해 우수한 트랜잭션 관리자는 ZwRollbackEnlistment를 호출합니다.
우수한 인리스트먼트를 복구하기 위해 우수한 트랜잭션 관리자는 ZwRecoverEnlistment를 호출합니다.
우수한 트랜잭션 관리자가 트랜잭션을 커밋, 롤백 또는 복구하면 KTM은 모든 하위 인리스트먼트에 트랜잭션 알림을 전송하여 참여할 수 있도록 합니다.
우수한 트랜잭션 관리자를 포함하는 TPS는 단일 단계 커밋 작업을 사용할 수 없습니다.
복구 작업 중에 KTM이 트랜잭션 결과를 확인할 수 없는 경우 우수한 트랜잭션 관리자에게 TRANSACTION_NOTIFY_RECOVER_QUERY 알림을 보냅니다. 이에 대한 응답으로 트랜잭션을 커밋할 수 있는 경우 우수한 트랜잭션 관리자가 ZwCommitEnlistment 를 호출하거나 트랜잭션을 롤백해야 하는 경우 ZwRollbackEnlistment 를 호출해야 합니다. 우수한 트랜잭션 관리자가 트랜잭션의 결과를 확인할 수 없는 경우 결과를 확인할 수 있기 전까지는 TRANSACTION_NOTIFY_RECOVER_QUERY 알림에 응답하지 않아야 합니다.