Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Диспетчер ресурсов упрощает разрешение устойчивых участий в транзакции путем повторного присоединения участника транзакции после сбоя ресурса.
Процесс восстановления
Чтобы надежно зарегистрировать ресурс (описанный реализацией интерфейса IEnlistmentNotification), который позже может быть включен в процессы восстановления, следует вызвать метод EnlistDurable. Также необходимо предоставить EnlistDurable метод с идентификатором диспетчера ресурсов (a Guid), который используется для систематической маркировки участника транзакции при отказе ресурса. По этой причине Guid для начального вызова enlist должно быть идентично параметру resourceManagerIdentifier во время вызова Reenlist в процессе восстановления. В противном случае генерируется TransactionException. Дополнительные сведения о устойчивых задействованиях см. в разделе "Задействование ресурсов в качестве участников транзакции".
На этапе подготовки (этап 1) протокола 2PC, когда реализация устойчивого диспетчера ресурсов получает Prepare уведомление, она должна записать запись подготовки на этом этапе. Запись должна содержать все сведения, необходимые для завершения транзакции при подтверждении. Запись подготовки можно позже получить во время восстановления, извлекая свойство RecoveryInformation() из обратного вызова prepareEnlistment. Ведение журнала записей не требуется выполнять в методе Prepare , так как RM может сделать это в рабочем потоке.
Процесс восстановления состоит из следующих двух этапов:
Шаг 1. ПереЗарегистрироваться
Диспетчер ресурсов проверяет информационную запись о подготовке для каждого участия, находящегося в состоянии неопределенности. Это делается путем изучения RecoveryInformation() свойства обратного PreparingEnlistment вызова, которое передается диспетчеру ресурсов в уведомлении на Prepare этапе 1.
Для каждой такой записи он делает проверку и вызывает Reenlist в диспетчере транзакций. Этот метод передает уникальный Guid, который идентифицирует диспетчер ресурсов, а также информацию о подключении в виде массива байтов. Возвращается новый Enlistment объект. Если повторная регистрация завершается неудачей из-за исключения, диспетчер ресурсов должен повторить попытку позже.
Вызывайте метод Reenlist только когда диспетчер ресурсов перезапускается после сбоя. Кроме того, необходимо повторно добавить в список неразрешенных транзакций, зарегистрированных диспетчером ресурсов на начальном этапе подготовки двухфазной фиксации. Любая попытка вызвать этот метод в недопустимое время может привести к ошибочным результатам.
При повторном включении участника с помощью этого метода вызываются соответствующие методы фазы 2 IEnlistmentNotification, которые соответствуют результату транзакции (то есть Commit, Rollback или InDoubt).
Шаг 2. Завершение восстановления
По завершении всех повторных зачислений диспетчер ресурсов вызывает метод RecoveryComplete. Этот метод завершает восстановление и сообщает диспетчеру транзакций, что диспетчер ресурсов больше не имеет сомневающихся транзакций. При этом диспетчер ресурсов гарантирует, что метод Reenlist не будет вызван снова.
Диспетчер ресурсов не обязан разрешать все сомнительные транзакции перед участием в новых транзакциях. Первый шаг можно выполнить в любое время после того, как диспетчер ресурсов устанавливает связь с диспетчером транзакций, но только после вызова RecoveryComplete (шаг 2); шаг 1 не может быть выполнен снова. Шаг 2 можно повторять несколько раз, не влияя на результат транзакций.