커밋 작업 처리
커밋 작업에는 단일 단계 커밋 및 다단계 커밋 의 두 가지 유형 이 있습니다. 단일 단계 커밋 작업은 리소스 관리자가 응답해야 하는 단일 알림으로 구성되지만 다단계 커밋 작업에는 준비 단계에 대한 추가 알림이 포함됩니다.
단일 단계 커밋 작업은 구현하는 것이 더 간단합니다. 다음 특성 중 하나가 있는 TPS(트랜잭션 처리 시스템)에 적합합니다.
단일 리소스 관리자.
읽기 전용 이며 커밋 작업에 참여하지 않는 리소스 관리자를 제외한 여러 리소스 관리자가 있습니다.
여러 리소스 관리자가 커밋 작업에 참여하는 경우 다단계 커밋 작업이 필요합니다.
Single-Phase 커밋 작업
TPS가 단일 단계 커밋 작업을 지원하려면 리소스 관리자가 등록해야 인리스트먼트에 대한 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 알림을 받을 수 있습니다. 다른 모든 리소스 관리자는 읽기 전용이어야 합니다.
우수한 트랜잭션 관리자를 포함하는 TPS는 단일 단계 커밋을 사용할 수 없습니다.
리소스 관리자가 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 알림을 수신하도록 등록한 경우 트랜잭션 클라이언트가 ZwCommitTransaction을 호출할 때 KTM은 이러한 종류의 알림을 보냅니다.
리소스 관리자가 트랜잭션에 대한 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 알림을 받으면 트랜잭션을 커밋하거나 단일 단계 커밋을 거부할 수 있습니다.
트랜잭션을 커밋하려면 리소스 관리자가 다음을 수행해야 합니다.
CLFS 로그 스트림에 대한 CLFS 마샬링 영역과 같이 비영구 캐시(메모리 내 스토리지)에 보관하는 모든 데이터를 플러시합니다.
리소스 관리자는 캐시에서 지속성 스토리지 매체로 데이터를 이동해야 합니다. 예를 들어 CLFS를 사용하는 리소스 관리자는 ClfsFlushBuffers를 호출할 수 있습니다.
모든 데이터 변경 내용을 영구 및 공용으로 만듭니다(즉, 리소스 관리자의 scope 외부에서 표시됨).
ZwCommitComplete를 호출한 후 리소스 관리자는 ZwClose를 호출하여 인리스트먼트 핸들을 닫아야 합니다.
트랜잭션에 대한 단일 단계 커밋 작업을 거부하기 위해 리소스 관리자는 ZwSinglePhaseReject를 호출할 수 있습니다. 리소스 관리자가 ZwSinglePhaseReject를 호출하는 경우 KTM은 즉시 커밋 작업을 단일 단계에서 다단계로 변경합니다.
다른 리소스 관리자가 동일한 트랜잭션에 참여하는 경우 읽기 전용이어야 합니다. 그러나 단일 단계 커밋 작업을 처리하는 리소스 관리자가 트랜잭션을 커밋하거나 롤백했음을 나타내지 않고 인리스트먼트 핸들을 닫는 경우 수신되는 TRANSACTION_NOTIFY_RM_DISCONNECTED 알림을 수신하려면 등록해야 합니다.
다단계 커밋 작업
다단계 커밋 작업은 다음 이벤트 중 하나가 발생하면 시작됩니다.
트랜잭션 클라이언트가 ZwCommitTransaction을 호출하고 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 알림을 수신하도록 등록된 리소스 관리자가 없습니다.
리소스 관리자는 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 알림을 받은 후 ZwSinglePhaseReject 를 호출합니다.
다단계 커밋 작업은 사전 준비, 준비 및 커밋의 세 가지 순차적 단계로 구성됩니다.
준비 전 단계
커밋 작업의 사전 준비 단계( 0단계라고도 함)는 KTM이 모든 리소스 관리자에게 TRANSACTION_NOTIFY_PREPREPARE 알림을 보낼 때 시작됩니다. KTM은 트랜잭션에 대한 단일 단계 커밋 작업을 지원하는 리소스 관리자가 없거나 우수한 트랜잭션 관리자가 ZwPrepareEnlistment를 호출하는 경우 이 알림을 보냅니다.
각 리소스 관리자가 TRANSACTION_NOTIFY_PREPREPARE 알림을 받으면 다음을 수행해야 합니다.
CLFS 로그 스트림에 대한 CLFS 마샬링 영역과 같이 비영구 캐시(메모리 내 스토리지)에 보관하는 모든 데이터를 플러시합니다.
리소스 관리자는 캐시에서 지속성 스토리지 매체로 데이터를 이동해야 합니다. 예를 들어 CLFS를 사용하는 리소스 관리자는 ClfsFlushBuffers를 호출할 수 있습니다.
리소스 관리자가 ZwPreprepareComplete를 호출한 후에도 계속해서 클라이언트 요청을 수신하고 서비스할 수 있습니다. 그러나 리소스 관리자는 모든 데이터 수정을 지속성 스토리지 매체에 즉시 기록되는 캐시 통과 작업으로 처리해야 합니다.
리소스 관리자가 TRANSACTION_NOTIFY_PREPREPARE 알림을 처리하는 동안 오류가 발생하면 ZwRollbackEnlistment 를 호출하여 트랜잭션을 롤백해야 합니다.
준비 단계
커밋 작업의 준비 단계( 1단계라고도 함)는 KTM이 모든 리소스 관리자에게 TRANSACTION_NOTIFY_PREPARE 알림을 보낼 때 시작됩니다. KTM은 리소스 관리자가 단일 단계 커밋을 지원하지 않거나 우수한 트랜잭션 관리자가 ZwPrepareEnlistment를 호출하는 경우 TRANSACTION_NOTIFY_PREPREPARE 후에 이 알림을 보냅니다.
각 리소스 관리자가 TRANSACTION_NOTIFY_PREPARE 알림을 받으면 다음을 수행해야 합니다.
클라이언트 요청 서비스를 중지하고 클라이언트 후속 요청을 클라이언트 오류로 보고합니다.
모든 데이터가 지속형 스토리지로 이동되었는지 확인합니다.
리소스 관리자가 TRANSACTION_NOTIFY_PREPARE 알림을 처리하는 동안 오류가 발생하면 ZwRollbackEnlistment 를 호출하여 트랜잭션을 롤백해야 합니다. 그러나 리소스 관리자는 ZwPrepareComplete를 호출한 후에는 트랜잭션을 롤백할 수 없습니다.
커밋 단계
커밋 작업의 커밋 단계( 2단계라고도 함)는 KTM이 모든 리소스 관리자에게 TRANSACTION_NOTIFY_COMMIT 알림을 보낼 때 시작됩니다. KTM은 리소스 관리자가 단일 단계 커밋을 지원하지 않거나 우수한 트랜잭션 관리자가 ZwCommitEnlistment를 호출하는 경우 TRANSACTION_NOTIFY_PREPARE 후에 이 알림을 보냅니다.
각 리소스 관리자가 TRANSACTION_NOTIFY_COMMIT 알림을 받으면 다음을 수행해야 합니다.
모든 데이터 변경 내용을 영구 및 공용으로 만듭니다(즉, 다른 트랜잭션에 표시됨).
일반적으로 리소스 관리자는 트랜잭션의 저장된 데이터를 로그 스트림에서 데이터베이스의 퍼블릭 영구 스토리지로 복사하여 영구 및 공용 변경 내용을 만듭니다. 로그 스트림을 사용하는 방법에 대한 자세한 내용은 KTM에서 로그 스트림 사용을 참조하세요.
리소스 관리자가 ZwCommitComplete를 호출한 후 ZwClose 를 호출하여 인리스트먼트 핸들을 닫아야 합니다.
리소스 관리자가 TRANSACTION_NOTIFY_COMMIT 알림을 처리하는 동안 오류가 발생하면 자체 종료해야 합니다. 다음에 운영 체제가 리소스 관리자를 다시 로드할 때 리소스 관리자의 복구 프로세스 는 오류가 발생하기 전에 양수로 알려진 상태로 트랜잭션을 복원해야 합니다.