2011-11-08 1 views
2

IEnlistmentNotification을 구현하여 리소스 관리자를 만들고 있습니다. 나는 내게 몇 가지 질문을 제기 한 내구성있는 RM을 만들려고 노력하고있다. 영구 리소스 관리자 (IEnlistmentNotification) 복구

  1. 트랜잭션 당 IEnlistmentNotification 객체가 있어야 또는 단일 IEnlistmentNotification 목적은 모든 트랜잭션을 처리해야합니까?

    나는 각 트랜잭션이 자신이 그것을 원할 것이므로 각 트랜잭션마다 Prepare/Commit/Rollback을 할 수 있다고 생각한다.

  2. 복구 파일은 어떻게 처리됩니까?

    내 가정은 준비 중에 트랜잭션에서 일어나는 모든 작업이 복구 파일에 기록된다는 가정입니다.

    각 거래의 정보를 어떻게 분리 할 수 ​​있습니까? 나는 각각의 트랜잭션이 개별 파일을 가지거나 하나의 파일이 각 복구 작업을위한 일종의 트랜잭션 ID를 가질 것이라고 생각한다.

    복구가 진행 중일 때 Transaction.Current.TransactionInformation.DistributedIdentifier/LocalIdentifier은 (는) 충돌 이전과 동일합니까? 따라서 이러한 ID 중 하나를 사용하여 복구 중 트랜잭션을 식별 할 수 있습니다.

  3. 어떻게 복구가 발생합니까?

    내 리소스 관리자가 내부에 사용중인 TransactionScope이 있고 범위의 중간에 시스템 충돌 (플러그가 꽂혀 있거나 무엇이든)이 발생하면 시스템이 다시 시작될 때 복구가 어떻게됩니까? 시스템 충돌에 대해 알고있는 범위의 코드를 실행하고있는 프로세스가 있다고 가정합니다. 이 경우 어떤 시스템/프로그램/서비스가 실제로 복구를 처리하도록 설정되어 있습니까?

답변

1

나는 대답을 모두 RavenDB Source Code에서 찾았다 고 생각합니다.

  1. 예, 모든 거래에는 고유 한 IEnlistmentNotification이 있어야합니다.
  2. 예, 'Transaction.TransactionInformation.DistributedIdentifier/LocalIdentifier'를 사용하여 복구 파일의 트랜잭션을 추적합니다.
  3. 코드가 실행되는 앱은 복구가 필요한지 확인한 다음 플러그를 뽑을 때 완료되지 않은 트랜잭션을 다시 등록합니다.