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


Реализация диспетчера ресурсов

Каждый ресурс, используемый в транзакции, управляется диспетчером ресурсов, действия которого координируются диспетчером транзакций. Диспетчеры ресурсов сотрудничают с диспетчером транзакций, чтобы обеспечить приложение гарантией атомарности и изоляции. Microsoft SQL Server, устойчивые очереди сообщений, хэш-таблицы в памяти — это все примеры диспетчеров ресурсов.

Диспетчер ресурсов управляет устойчивыми или переменными данными. Устойчивость (или наоборот, волатильность) диспетчера ресурсов указывает, поддерживает ли диспетчер ресурсов восстановление сбоев. Если диспетчер ресурсов поддерживает восстановление сбоев, он сохраняет данные в надежном хранилище во время этапа 1 (подготовка), таким образом, если диспетчер ресурсов выходит из строя, он может повторно присоединиться к транзакции при восстановлении и выполнять соответствующие действия на основе уведомлений, полученных от диспетчера транзакций. Как правило, диспетчеры нестабильных ресурсов управляют такими ресурсами, как структуры данных в памяти (например, транзакционная хэш-таблица в памяти), а диспетчеры устойчивых ресурсов управляют ресурсами, которые имеют более постоянное резервное хранилище (например, база данных, резервным хранилищем которой является диск).

Чтобы ресурс участвовал в транзакции, он должен зарегистрироваться в ней. Класс Transaction определяет набор методов, имена которых начинаются с enlist , которые предоставляют эту функцию. Различные методы enlist соответствуют различным типам регистрации, которые могут иметь менеджеры ресурсов. В частности, вы используете EnlistVolatile методы для переменных ресурсов и EnlistDurable метод для устойчивых ресурсов. Для простоты, после принятия решения о том, следует ли использовать метод EnlistDurable или EnlistVolatile в зависимости от поддержки устойчивости вашего ресурса, следует задействовать ваш ресурс для участия в двухфазной фиксации (2PC), реализуя интерфейс IEnlistmentNotification для диспетчера ресурсов. Дополнительные сведения о 2PC см. в разделе "Фиксация транзакции" в Single-Phase и на нескольких этапах.

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

После подключения менеджер ресурсов отвечает на запросы транзакции. Диспетчер устойчивых ресурсов хранит достаточно информации, чтобы разрешить ей отменить или повторно выполнить работу транзакции с ресурсами, которыми она управляет. Есть много способов сделать это; сохранение версий данных или сохранение журнала изменений — это два распространенных метода.

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

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

После подготовки диспетчер ресурсов должен ожидать получения команды фиксации или команды отката от диспетчера транзакций в фазе 2. Как правило, весь протокол подготовки и фиксации завершается за доли секунды. Если возникают сбои системы или связи, уведомление о подтверждении или отмене может не доходить минутами или часами. В течение этого периода диспетчер ресурсов сомневается в результатах транзакции. Он не знает, зафиксирована ли транзакция или прервана. Хотя диспетчер ресурсов сомневается в транзакции, он сохраняет измененные данные, сохраняя блокировку транзакции, тем самым изолируя эти изменения от любых других транзакций.

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

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

Класс Transaction также предоставляет метод EnlistPromotableSinglePhase для участия в повышаемом однофазовом зачислении (PSPE). Это позволяет устойчивому диспетчеру ресурсов (RM) размещать и управлять транзакцией, которая позже может быть передана под управление MSDTC, если это необходимо. Дополнительные сведения об этом см. в статье Оптимизация с использованием однофазной фиксации и уведомления о возможности однофазной фиксации.

В этом разделе

Действия, за которыми обычно следует диспетчер ресурсов, описаны в следующих разделах.

Привлечение ресурсов в качестве участников транзакции

Описывает, как устойчивый или неустойчивый ресурс может присоединиться к транзакции.

Фиксация транзакции в Single-Phase и многофазном режиме

Описывает, как диспетчер ресурсов реагирует на уведомление о фиксации и готовит фиксацию.

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

Описывает, как устойчивый диспетчер ресурсов восстанавливается после сбоя.

Уровни доверия безопасности в доступе к ресурсам

Описывает, как три уровня доверия для System.Transactions ограничивают доступ к типам предоставляемых ресурсов System.Transactions .

Оптимизация с помощью однофазного подтверждения и уведомления о продвигаемом однофазном подтверждении

Описывает методики оптимизации, доступные для реализации диспетчеров ресурсов.