Поделиться через


Выполнение восстановления

Диспетчер ресурсов обеспечивает разрешение зачислений устойчивых ресурсов в транзакции, повторно зачисляя участника транзакции после сбоя ресурса.

Процесс восстановления

Для зачисления устойчивого ресурса (описываемого реализацией интерфейса IEnlistmentNotification), который способен к восстановлению, необходимо вызвать метод EnlistDurable. Кроме того, необходимо предоставить метод EnlistDurable с идентификатором диспетчера ресурсов (Guid), который используется для постоянной отметки участника транзакции в событии сбоя ресурса. По этой причине Guid для начального вызова enlist должно совпадать с параметром resourceManagerIdentifier во Reenlist время восстановления. В противном случае возникает исключение TransactionException. Дополнительные сведения о устойчивых перечислениях см. в разделе "Перечисление ресурсов в качестве участников транзакции".

Если в фазе подготовки (фазе 1) протокола двухфазной фиксации пользовательская реализация диспетчера ресурсов получает уведомление Prepare, она должна создать запись о подготовке в журнале. Запись должна включать всю необходимую информацию для завершения транзакции фиксацией. После этого запись подготовки можно получить во время восстановления, извлекая RecoveryInformation свойство обратного вызова prepareEnlistment . Создание этой записи в рамках метода Prepare не требуется, поскольку диспетчер ресурсов может сделать это в рабочем потоке.

Процесс восстановления состоит из следующих двух шагов.

Шаг 1 - повторное зачисление

Диспетчер ресурсов проверяет запись о подготовке для каждого зачисления, которое находится под сомнением. Это выполняется путем проверки свойства RecoveryInformation обратного вызова PreparingEnlistment, переданного диспетчеру ресурсов в уведомлении Prepare в фазе 1.

Для каждого проверяемого зачисления диспетчер ресурсов вызывает метод Reenlist для диспетчера транзакций. Этот метод передает уникальный Guid, идентифицирующий диспетчер ресурсов, а также данные перечисления в массиве байтов. Возвращается новый объект Enlistment. Если в результате повторного зачисления возникает исключение, диспетчеру необходимо повторить попытку через некоторое время.

Метод Reenlist следует вызывать только после перезапуска диспетчера ресурсов после сбоя. Кроме того, повторное зачисление следует выполнить только для неразрешенных транзакций, зарегистрированных диспетчером ресурсов в ходе начальной фазы подготовки двухфазной фиксации. Любая попытка вызова этого метода в недопустимое время может привести к ошибочным результатам.

При повторном зачислении участника с помощью этого метода в зависимости от результата транзакции вызывается соответствующий метод фазы 2 интерфейса IEnlistmentNotification (Commit, Rollback или InDoubt).

Шаг 2 - завершение восстановления

После завершения всех повторных зачислений диспетчер транзакций вызывает метод RecoveryComplete. Этот метод завершает восстановление и информирует диспетчер транзакций о том, что у диспетчера ресурсов больше нет транзакций, находящихся под сомнением. Это позволяет гарантировать, что диспетчер ресурсов не вызовет метод Reenlist повторно.

От диспетчера ресурсов не требуется разрешения всех транзакций, находящихся по сомнением, перед повторным зачислением в новые транзакции. Первый шаг можно выполнить в любое время после того, как диспетчер ресурсов устанавливает связь с диспетчером транзакций, но после RecoveryComplete вызова (шаг 2); шаг 1 не может быть выполнен снова. Шаг 2 можно выполнить несколько раз без воздействия на результат транзакций.