트랜잭션 알림

KTM은 각 리소스 관리자에 대한 알림 큐를 제공합니다. KTM은 리소스 관리자의 큐에 배치하여 리소스 관리자에게 알림을 전달합니다.

리소스 관리자는 동기적으로 또는 비동기적으로 큐에서 알림을 검색할 수 있습니다.

  • 알림을 동기적으로 검색하기 위해 리소스 관리자는 ZwGetNotificationResourceManager를 반복적으로 호출할 수 있습니다.

  • 알림을 비동기적으로 수신하기 위해 리소스 관리자는 TmEnableCallbacks를 호출하여 콜백 루틴을 설정할 수 있습니다. KTM은 리소스 관리자의 큐에 알림을 넣을 때마다 콜백 루틴을 호출합니다.

리소스 관리자가 ZwCreateEnlistment 를 호출하여 트랜잭션에 대한 인리스트먼트를 만들면 리소스 관리자는 수신해야 하는 알림 유형을 지정합니다. 리소스 관리자는 수신하도록 등록하는 알림만 받습니다.

알림 상수는 Ktmtypes.h에 정의되어 있습니다. 알림 상수 이름은 TRANSACTION_NOTIFY_Xxx 형식입니다.

이 항목의 나머지 부분에는 Ktmtypes.h에서 정의하고 세 그룹으로 나누는 모든 알림 상수가 나열되어 있습니다.

  • 리소스 관리자가 받을 수 있는 알림

  • 우수한 트랜잭션 관리자가 받을 수 있는 알림

  • 정의되었지만 현재 사용되지 않는 알림 상수

리소스 관리자에 대한 알림

모든 리소스 관리자는 나중에 ZwReadOnlyEnlistment 를 호출하여 인리스트먼트를 읽기 전용으로 표시하더라도 TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE 및 TRANSACTION_NOTIFY_COMMIT 알림을 수신하도록 등록해야 합니다.

리소스 관리자는 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 지원할 수 있지만 다단계 사전 준비, 준비 및 커밋 알림도 지원해야 합니다.

다음 목록에는 리소스 관리자가 받을 수 있는 모든 알림이 포함되어 있습니다.

TRANSACTION_NOTIFY_PREPREPARE
전송 시: 클라이언트가 ZwCommitTransaction 을 호출하고 리소스 관리자가 단일 단계 커밋을 지원하지 않거나 우수한 트랜잭션 관리자ZwPrepareEnlistment를 호출하는 경우

수신자: 리소스 관리자.

받는 사람의 필수 작업: 사전 준비 작업을 수행한 다음 ZwPrePrepareComplete를 호출합니다. (사전 준비 작업에 대한 자세한 내용은 커밋 작업 처리를 참조하세요.)

제한: 또한 리소스 관리자는 TRANSACTION_NOTIFY_PREPARE 및 TRANSACTION_NOTIFY_COMMIT 지원해야 합니다.

TRANSACTION_NOTIFY_PREPARE
전송 시: 클라이언트가 ZwCommitTransaction 을 호출하고 리소스 관리자가 단일 단계 커밋을 지원하지 않는 경우 또는 우수한 트랜잭션 관리자가 ZwPrepareEnlistment를 호출하는 경우 TRANSACTION_NOTIFY_PREPREPARE.

수신자: 리소스 관리자.

받는 사람의 필수 작업: 준비 작업을 수행한 다음 ZwPrepareComplete를 호출합니다. (작업 준비에 대한 자세한 내용은 커밋 작업 처리를 참조하세요.)

제한: 또한 리소스 관리자는 TRANSACTION_NOTIFY_PREPREPARE 및 TRANSACTION_NOTIFY_COMMIT 지원해야 합니다.

TRANSACTION_NOTIFY_COMMIT
전송 시: 클라이언트가 ZwCommitTransaction 을 호출하고 리소스 관리자가 단일 단계 커밋을 지원하지 않는 경우 또는 우수한 트랜잭션 관리자가 ZwCommitEnlistment를 호출하는 경우 TRANSACTION_NOTIFY_PREPARE 후.

수신자: 리소스 관리자.

받는 사람의 필수 작업: 커밋 작업을 수행한 다음 ZwCommitComplete를 호출합니다. 커밋 작업에 대한 자세한 내용은 커밋 작업 처리를 참조하세요.

제한: 또한 리소스 관리자는 TRANSACTION_NOTIFY_PREPREPARE 및 TRANSACTION_NOTIFY_PREPARE 지원해야 합니다.

TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT
전송 시: 클라이언트는 ZwCommitTransaction 을 호출하고 리소스 관리자는 단일 단계 커밋 작업을 지원합니다.

수신자: 리소스 관리자.

받는 사람의 필수 작업: 트랜잭션을 커밋하거나 ZwSinglePhaseReject를 호출합니다. (단일 단계 커밋 작업에 대한 자세한 내용은 커밋 작업 처리를 참조하세요.)

제한: 또한 리소스 관리자는 TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE 및 TRANSACTION_NOTIFY_COMMIT 지원해야 합니다.

TRANSACTION_NOTIFY_ROLLBACK
전송 시: 클라이언트가 ZwRollbackTransaction을 호출하거나, 우수한 트랜잭션 관리자가 ZwRollbackEnlistment를 호출하거나, KTM이 오류를 검색합니다(예: 로그 스트림에 대한 쓰기 실패).

수신자: 리소스 관리자와 우수한 트랜잭션 관리자 모두.

받는 사람의 필수 작업: 트랜잭션의 데이터를 롤백한 다음 ZwRollbackComplete를 호출하는 데 필요한 작업을 수행합니다. (롤백 작업에 대한 자세한 내용은 롤백 작업 처리를 참조하세요.)

제한: 모든 리소스 관리자와 우수한 트랜잭션 관리자는 TRANSACTION_NOTIFY_ROLLBACK 지원해야 합니다.

TRANSACTION_NOTIFY_RECOVER
전송 시: 리소스 관리자가 ZwRecoverResourceManager를 호출합니다.

수신자: 리소스 관리자.

받는 사람의 필수 작업: 리소스 관리자는 ZwRecoverEnlistment를 호출해야 합니다. (복구 작업에 대한 자세한 내용은 복구 작업 처리를 참조하세요.)

제한 사항: 없음

TRANSACTION_NOTIFY_LAST_RECOVER
보낸 경우: KTM이 리소스 관리자의 인리스트먼트에 대한 마지막 TRANSACTION_NOTIFY_RECOVER 보낸 후

수신자: 리소스 관리자.

받는 사람의 필수 작업: 복구 작업을 종료합니다. (복구 작업에 대한 자세한 내용은 복구 작업 처리를 참조하세요.)

제한 사항: 없음

TRANSACTION_NOTIFY_INDOUBT
전송 시: 리소스 관리자가 ZwRecoverEnlistment를 호출한 후 KTM이 트랜잭션을 커밋할지 롤백해야 하는지 여부를 확인할 수 없는 경우(일반적으로 TPS에는 사용할 수 없는 우수한 트랜잭션 관리자가 있기 때문).

수신자: 리소스 관리자.

받는 사람의 필수 작업: KTM이 TRANSACTION_NOTIFY_COMMIT 보내거나 TRANSACTION_NOTIFY_ROLLBACK 때까지 아무 작업도 수행하지 않습니다.

제한 사항: 없음

TRANSACTION_NOTIFY_RM_DISCONNECTED
전송되는 경우: 단일 단계 커밋 작업을 처리하는 리소스 관리자는 트랜잭션을 커밋하거나 롤백했음을 나타내지 않고 인리스트먼트 핸들을 닫습니다.

수신자: 트랜잭션에 대한 인리스트먼트가 있는 리소스 관리자 및 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 트랜잭션별 정리 작업. 일반적으로 이 알림은 읽기 전용 리소스 관리자에게 유용합니다.

제한 사항: 없음

우수한 트랜잭션 관리자에 대한 알림

우수한 트랜잭션 관리자는 다음 알림을 받을 수 있습니다.

TRANSACTION_NOTIFY_ROLLBACK
이전 설명을 참조하세요.

TRANSACTION_NOTIFY_RM_DISCONNECTED
이전 설명을 참조하세요.

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
보낸 경우: 모든 리소스 관리자가 TRANSACTION_NOTIFY_PREPREPARE 받고 ZwPrepareComplete를 호출하여 응답한 후

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 우수한 트랜잭션 관리자는 ZwPrepareEnlistment를 호출해야 합니다.

TRANSACTION_NOTIFY_PREPARE_COMPLETE
보낸 경우: 모든 리소스 관리자가 TRANSACTION_NOTIFY_PREPARE 받고 ZwPrepareComplete를 호출하여 응답한 후

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 우수한 트랜잭션 관리자는 ZwCommitEnlistment를 호출해야 합니다.

TRANSACTION_NOTIFY_COMMIT_COMPLETE
보낸 경우: 모든 리소스 관리자가 TRANSACTION_NOTIFY_COMMIT 받고 ZwCommitComplete를 호출하여 응답한 후

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 트랜잭션 정리 작업.

TRANSACTION_NOTIFY_ROLLBACK_COMPLETE
보낸 경우: 모든 리소스 관리자가 TRANSACTION_NOTIFY_ROLLBACK 받고 ZwRollbackComplete를 호출하여 응답한 후

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 트랜잭션 정리 작업.

TRANSACTION_NOTIFY_RECOVER_QUERY
전송 시: 우수한 트랜잭션 관리자가 ZwRecoverResourceManager를 호출합니다.

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 우수한 트랜잭션 관리자는 인리스트 먼트에 대해 ZwCommitEnlistment 또는 ZwRollbackEnlistment 를 호출해야 합니다.

TRANSACTION_NOTIFY_COMMIT_REQUEST
전송 시: 클라이언트가 ZwCommitTransaction을 호출합니다. 우수한 트랜잭션 관리자가 인리스트먼트를 위해 이 알림에 등록한 경우 KTM은 리소스 관리자에게 TRANSACTION_NOTIFY_COMMIT 보내는 대신 우수한 트랜잭션 관리자에게 TRANSACTION_NOTIFY_COMMIT_REQUEST 보냅니다.

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 우수한 트랜잭션 관리자가 ZwCommitEnlistment를 호출합니다.

TRANSACTION_NOTIFY_REQUEST_OUTCOME
전송 시: 트랜잭션이 준비된 상태인 동안 리소스 관리자가 TmRequestOutcomeEnlistment 를 호출합니다.

수신자: 우수한 트랜잭션 관리자.

받는 사람의 필수 작업: 우수한 트랜잭션 관리자는 ZwCommitEnlistment 또는 ZwRollbackEnlistment를 호출해야 합니다.

사용하지 않는 알림

다음 알림은 Ktmtypes.h에 정의되어 있지만 KTM은 현재 이를 지원하지 않습니다.

TRANSACTION_NOTIFY_DELEGATE_COMMIT

TRANSACTION_NOTIFY_ENLIST_MASK

TRANSACTION_NOTIFY_ENLIST_PREPREPARE

TRANSACTION_NOTIFY_MARSHAL

TRANSACTION_NOTIFY_PROMOTE

TRANSACTION_NOTIFY_PROMOTE_NEW

TRANSACTION_NOTIFY_PROPAGATE_PULL

TRANSACTION_NOTIFY_PROPAGATE_PUSH

TRANSACTION_NOTIFY_TM_ONLINE

TRANSACTION_NOTIFY_COMMIT_FINALIZE