Восстановление долговременного диспетчера ресурсов (IEnlistmentNotification)

#c# #.net #resourcemanager

#c# #.net #resourcemanager

Вопрос:

Я создаю менеджер ресурсов путем реализации IEnlistmentNotification . Я пытаюсь создать надежную RM, которая вызвала у меня несколько вопросов.

  1. Должен ли существовать IEnlistmentNotification объект для каждой транзакции или один IEnlistmentNotification объект должен обрабатывать все транзакции?

    Я бы подумал, что каждая транзакция хотела бы иметь свою собственную, чтобы она могла выполнять подготовку / фиксацию / откат для каждой транзакции.

  2. Как обрабатывается файл восстановления?

    Я предполагаю, что все, что происходит в транзакции, будет записано в файл восстановления во время подготовки.

    Как можно разделить информацию для каждой транзакции? Я бы подумал, что у каждой транзакции будет отдельный файл или что у одного файла будет какой-то идентификатор транзакции для каждой операции восстановления.

    Когда происходит восстановление, это Transaction.Current.TransactionInformation.DistributedIdentifier/LocalIdentifier то же самое, что и до сбоя? Итак, можно ли использовать один из этих идентификаторов для идентификации транзакции во время восстановления.

  3. Как происходит восстановление?

    Если у меня есть TransactionScope , внутри которого используется мой менеджер ресурсов, и система выходит из строя (выдернут штекер или что-то еще) в середине области видимости, как происходит восстановление при резервном запуске системы? Я предполагаю, что какой-то процесс, который запускал код, в котором есть область видимости, знает о сбоях системы или что-то в этом роде? В таком случае, какие системы / программы / службы настроены для фактического выполнения восстановления?

Ответ №1:

Я полагаю, что нашел все ответы в исходном коде RavenDB.

  1. Да, у каждой транзакции должно быть собственное IEnlistmentNotification.
  2. Да, вы используете `Транзакцию.Информация о транзакции.DistributedIdentifier/localIdentifier’ для отслеживания транзакций в файле или файлах восстановления.
  3. Приложение, выполняющее код, выполнит проверку, требуется ли восстановление, и повторно зарегистрирует транзакции, которые не были завершены при отключении подключения.