다음을 통해 공유


Resource Manager 구현

트랜잭션에 사용되는 각 리소스는 트랜잭션 관리자가 작업을 조정하는 리소스 관리자에 의해 관리됩니다. 리소스 관리자는 트랜잭션 관리자와 협력하여 애플리케이션에 원자성 및 격리를 보장합니다. Microsoft SQL Server, 지속성 메시지 큐, 메모리 내 해시 테이블은 모두 리소스 관리자의 예입니다.

리소스 관리자는 지속성 또는 휘발성 데이터를 관리합니다. 리소스 관리자의 내구성(또는 반대로 변동성)은 리소스 관리자가 오류 복구를 지원하는지 여부를 나타냅니다. 리소스 관리자가 오류 복구를 지원하는 경우 리소스 관리자가 중단될 경우 트랜잭션에 다시 참여하여 트랜잭션 관리자로부터 받은 알림에 따라 적절한 작업을 수행할 수 있도록 1단계(준비) 중에 데이터를 지속성 스토리지에 유지합니다. 일반적으로 휘발성 리소스 관리자는 메모리 내 데이터 구조(예: 메모리 내 트랜잭션 해시 테이블)와 같은 휘발성 리소스를 관리하고, 지속성 리소스 관리자는 더 영구적 백업 저장소가 있는 리소스(예: 백업 저장소가 디스크인 데이터베이스)를 관리합니다.

리소스가 트랜잭션에 참여하려면 트랜잭션에 참여해야 합니다. 클래스는 Transaction 이름이 이 기능을 제공하는 Enlist 로 시작하는 메서드 집합을 정의합니다. 다양한 인리스트먼트 메서드는 리소스 관리자가 가질 수 있는 다양한 유형의 인리스트먼트에 해당합니다. 특히 휘발성 리소스에 EnlistVolatile 대한 메서드와 EnlistDurable 지속성 리소스에 대한 메서드를 사용합니다. 간단히 하기 위해 리소스의 내구성 지원에 따라 EnlistDurable 또는 EnlistVolatile 메서드를 사용할지 결정한 후, 리소스 관리자에 대한 IEnlistmentNotification 인터페이스를 구현하여 리소스를 2PC(2단계 커밋)에 참여하도록 등록해야 합니다. 2PC에 대한 자세한 내용은 Single-Phase 및 다단계에서 트랜잭션 커밋을 참조하세요.

리소스 관리자는 등록을 통해 트랜잭션이 커밋되거나 중단되면 트랜잭션 관리자로부터 콜백을 받도록 합니다. 인리스트먼트당 하나의 인스턴스 IEnlistmentNotification 가 있습니다. 일반적으로 트랜잭션당 하나의 인리스트먼트가 있지만 리소스 관리자는 동일한 트랜잭션에 여러 번 등록하도록 선택할 수 있습니다.

인리스트먼트 후 리소스 관리자는 트랜잭션의 요청에 응답합니다. 지속성 리소스 관리자는 관리하는 리소스에 대한 트랜잭션 작업을 실행 취소하거나 다시 실행하도록 충분한 정보를 저장합니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 데이터 버전을 유지하거나 변경 로그를 유지하는 두 가지 일반적인 기술입니다.

애플리케이션이 트랜잭션을 커밋하면 트랜잭션 관리자는 2단계 커밋 프로토콜을 시작합니다. 트랜잭션 관리자는 먼저 등록된 각 리소스 관리자에게 트랜잭션을 커밋할 준비가 되었는지 묻습니다. 리소스 관리자는 커밋을 준비해야 합니다. 즉, 트랜잭션을 커밋하거나 중단할 준비가 됩니다.

준비 단계에서 지속성 리소스 관리자는 안정적인 스토리지에 이전 데이터와 새 데이터를 기록하므로 시스템이 실패하더라도 리소스 관리자가 복구할 수 있습니다. 리소스 관리자가 준비할 수 있는 경우 트랜잭션 관리자에게 트랜잭션 커밋 또는 중단 여부에 대한 투표를 알릴 수 있습니다. 리소스 관리자가 준비 실패를 보고하면 트랜잭션 관리자는 각 리소스 관리자에게 롤백 명령을 보내고 애플리케이션에 대한 커밋 실패를 나타냅니다.

준비되면 리소스 관리자는 2단계에서 트랜잭션 관리자에서 커밋 또는 중단 콜백을 받을 때까지 기다려야 합니다. 일반적으로 전체 준비 및 커밋 프로토콜은 1초 안에 완료됩니다. 시스템 또는 통신 오류가 있는 경우 커밋 또는 중단 알림이 몇 분 또는 몇 시간 동안 도착하지 않을 수 있습니다. 이 기간 동안 리소스 관리자는 트랜잭션의 결과에 대해 의심스럽습니다. 트랜잭션이 커밋되었는지 또는 중단되었는지는 알 수 없습니다. 리소스 관리자는 트랜잭션에 대해 의심스럽지만 트랜잭션을 잠근 상태로 유지하여 데이터를 수정된 상태로 유지하므로 이러한 변경 내용을 다른 트랜잭션과 격리합니다.

리소스 관리자가 실패하면 실패하기 전에 준비되거나 커밋된 트랜잭션을 제외하고 모든 인리스트먼트된 트랜잭션이 중단됩니다. 영구적인 리소스 관리자가 다시 시작되면, 준비 단계에서 작성된 준비 정보를 검색하여 관리하는 리소스의 커밋된 상태를 다시 구성하고 그에 따라 이러한 트랜잭션을 커밋하거나 중지합니다.

요약하자면, 2단계 커밋 프로토콜과 리소스 관리자가 결합하여 트랜잭션을 원자성 및 내구성으로 만듭니다.

클래스는 또한 PSPE(승격 가능한 단일 단계 인리스트먼트)를 등록하는 Transaction 메서드를 제공합니다 EnlistPromotableSinglePhase . 이렇게 하면 RM(지속성 리소스 관리자)이 필요한 경우 나중에 MSDTC에서 관리하도록 에스컬레이션할 수 있는 트랜잭션을 호스트하고 "소유"할 수 있습니다. 이에 대한 자세한 내용은 단일 단계 커밋 및 승격 가능한 단일 단계 알림을 사용하여 최적화를 참조하세요.

이 섹션 안에

일반적으로 리소스 관리자가 따르는 단계는 다음 항목에 설명되어 있습니다.

트랜잭션에서 참가자로 리소스 등록

지속성 또는 휘발성 리소스가 트랜잭션에 참여하는 방법을 설명합니다.

Single-Phase 및 다단계 프로세스에서 트랜잭션 커밋하기

리소스 관리자가 커밋 알림에 응답하고 커밋을 준비하는 방법을 설명합니다.

복구 수행

지속성 리소스 관리자가 실패에서 복구하는 방법을 설명합니다.

리소스 액세스의 보안 신뢰 수준

System.Transactions에 대한 세 가지 신뢰 수준이 노출되는 System.Transactions 리소스 유형에 대한 액세스를 제한하는 방법을 설명합니다.

단일 단계 커밋 및 승격 가능한 단일 단계 알림을 사용한 최적화

리소스 관리자의 구현에 사용할 수 있는 최적화 사례를 설명합니다.