다음을 통해 공유


복구 수행

리소스 관리자는 리소스 실패 후 트랜잭션 참가자를 다시 참여시켜 트랜잭션에서 지속 참여의 해결을 용이하게 합니다.

복구 프로세스

IEnlistmentNotification 인터페이스 구현에서 설명한 대로 나중에 복구할 수 있는 리소스를 지속적으로 참여시키려면 EnlistDurable 메서드를 호출해야 합니다. 또한 리소스 오류가 발생할 경우 트랜잭션 참가자에 일관성 있게 레이블을 지정하는 데 사용되는 리소스 관리자 식별자(EnlistDurable)를 Guid 메서드에 제공해야 합니다. 이러한 이유로 초기 Enlist 호출에 제공되는 Guid는 복구 중 Reenlist 호출의 resourceManagerIdentifier 매개 변수와 동일해야 합니다. 그렇지 않으면 TransactionException이 throw됩니다. 영구 참여에 대한 자세한 내용은 트랜잭션 참여자로 리소스 참여를 참조하세요.

2PC 프로토콜의 준비 단계(1단계)에서 지속적인 리소스 관리자의 구현이 Prepare 알림을 받는 경우 이 단계 중에 준비 레코드를 기록해야 합니다. 이 레코드에는 커밋 시 트랜잭션을 완료하는 데 필요한 모든 정보가 들어 있어야 합니다. 준비 레코드는 나중에 복구 중에 preparingEnlistment 콜백의 RecoveryInformation 속성을 검색하여 액세스할 수 있습니다. Prepare 메서드 내에서 레코드 로깅을 수행하지 않아도 됩니다. RM이 작업자 스레드에서 이 작업을 수행할 수 있습니다.

복구 프로세스는 다음 두 단계로 이루어집니다.

1단계 - ReEnlist

리소스 관리자는 준비 정보 레코드에서 불확실한 각 인리스트먼트를 검사합니다. 1단계 중에 RecoveryInformation 알림에 포함되어 리소스 관리자에게 전달되는 PreparingEnlistment 콜백의 Prepare 속성을 검사하면 됩니다.

리소스 관리자는 검사하는 각 인리스트먼트에 대해 트랜잭션 관리자에서 Reenlist를 호출합니다. 이 메서드는 리소스 관리자를 식별하는 고유한 Guid와 바이트 배열로 인터페이스 정보를 전달합니다. 새 Enlistment 개체가 반환됩니다. 예외가 발생하여 인리스트먼트 재시도가 실패하면 리소스 관리자가 나중에 다시 시도해야 합니다.

오류 발생 후 리소스 관리자가 다시 시작될 때만 Reenlist 메서드를 호출해야 합니다. 또한 2단계 커밋의 초기 준비 단계에서 리소스 관리자가 로그한 확인되지 않은 트랜잭션만 다시 등록해야 합니다. 잘못된 시간에 이 메서드를 호출하려는 모든 시도는 잘못된 결과를 생성할 수 있습니다.

참가자가 이 메서드를 사용하여 다시 목록에 추가하면 트랜잭션 결과(즉, Commit, Rollback 또는 InDoubt)에 해당하는 IEnlistmentNotification의 2단계 메서드가 적절하게 호출됩니다.

2단계 - 복구 완료

인리스트먼트 재시도가 모두 완료되면 리소스 관리자가 RecoveryComplete 메서드를 호출합니다. 이 메서드는 복구를 완료하고 리소스 관리자에 더 이상 불확실한 트랜잭션이 없음을 트랜잭션 관리자에게 알립니다. 이렇게 함으로써 리소스 관리자는 Reenlist 메서드를 다시 호출하지 않도록 합니다.

리소스 관리자가 새 트랜잭션에 참여하기 전에 불확실한 트랜잭션을 모두 해결할 필요는 없습니다. 첫 번째 단계는 리소스 관리자가 트랜잭션 관리자와 관계를 설정한 후 언제든지 수행할 수 있지만 RecoveryComplete가 호출된 후(2단계)에는 1단계를 다시 수행할 수 없습니다. 2단계는 트랜잭션의 결과에 영향을 주지 않고 여러 번 반복할 수 있습니다.