Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Диспетчеры ресурсов поддерживают данные каждой транзакции и регистрируют операции транзакции. Если в системе обработки транзакций (TPS) несколько диспетчеров ресурсов, каждый диспетчер ресурсов может участвовать в фиксации, откате и операциях восстановления каждой транзакции.
Каждый диспетчер ресурсов должен экспортировать интерфейс, который клиенты транзакций могут использовать для доступа к базе данных или другому ресурсу, который поддерживает диспетчер ресурсов.
Как правило, диспетчер ресурсов в режиме ядра должен выполнять следующие задачи в указанном порядке:
Создайте поток журналов.
Диспетчеры ресурсов могут использовать общую файловую систему журналов (CLFS) или другие возможности ведения журнала для поддержания потоков журналов. Вызов ClfsCreateLogFile создает поток журналов CLFS. Диспетчер ресурсов должен использовать поток журналов для записи всех сведений, необходимых для фиксации, отката или восстановления транзакций. Кроме того, KTM использует поток журналов для записи любых внутренних изменений состояния, которые могут потребоваться для восстановления транзакций.
Создайте объект диспетчера транзакций.
Вызов ZwCreateTransactionManager создает объект диспетчера транзакций и подключает диспетчер ресурсов к дополнительному потоку журнала CLFS, который указывает диспетчер ресурсов.
Восстановите состояние диспетчера транзакций.
Вызов ZwRecoverTransactionManager считывает поток журнала объекта диспетчера транзакций (который поддерживает KTM) и определяет, был ли TPS завершен до завершения всех транзакций (например, из-за сбоя системы). KTM восстанавливает внутреннее состояние на основе сведений в потоке журналов.
Создайте объект resource manager.
Вызов ZwCreateResourceManager создает объект resource manager и связывает его с ранее созданным объектом диспетчера транзакций.
Восстановите состояние диспетчера ресурсов.
Вызов ZwRecoverResourceManager приводит к отправке KTM уведомлений TRANSACTION_NOTIFY_RECOVER диспетчеру ресурсов для любых транзакций, которые находились в процессе выполнения во время последнего завершения работы диспетчера ресурсов. Сведения о том, как диспетчер ресурсов должен реагировать на эти уведомления, см. в разделе "Обработка операций восстановления".
Получение транзакций от клиентов.
Как правило, клиент создает объект транзакции и использует клиентский интерфейс диспетчера ресурсов для передачи GUID объекта транзакции в диспетчер ресурсов. Например, диспетчер ресурсов может предоставить подпрограмму CreateDataObject , аналогичную описанной в разделе "Основные сведения о компонентах TPS ".
Участвуйте в каждой транзакции.
Вызов ZwOpenTransaction открывает дескриптор объекта транзакции, а затем вызов ZwCreateEnlistment создает перечисление для транзакции. Включение позволяет диспетчеру ресурсов получать указанный набор уведомлений о транзакциях.
Включите прием уведомлений о транзакциях.
Диспетчер ресурсов может вызвать ZwGetNotificationResourceManager для синхронного получения уведомлений или вызвать TmEnableCallbacks для регистрации подпрограммы обратного вызова ResourceManagerNotification , которая вызывает KTM всякий раз, когда уведомление доступно.
Запрашивайте доступ к ресурсам службы от клиентов, но не делайте изменения постоянными.
После создания объекта транзакции клиент обычно вызывает интерфейс диспетчера ресурсов для доступа к ресурсу диспетчера ресурсов. Например, диспетчер ресурсов для базы данных может получать запросы на чтение и запись в базу данных.
Диспетчер ресурсов должен записывать результаты операций чтения и записи в потоке журналов CLFS или с использованием других средств ведения журнала до тех пор, пока он не получит уведомление о том, что операции транзакции будут зафиксированы, отменены или восстановлены.
Фиксация или откат клиентских операций.
В итоге диспетчер ресурсов получает уведомление, чтобы начать фиксацию или отмену операций, выполненных клиентом. В ответ диспетчер ресурсов должен либо сделать клиентские операции постоянными, либо отменить их. Дополнительные сведения об обработке уведомлений о фиксации и откате см. в разделе "Обработка операций транзакций".
Иногда диспетчер ресурсов может попытаться принудительно заставить KTM быстро сделать уведомление о фиксации изменений или откате, возможно, потому что диспетчер ресурсов определил, что устройство было удалено без предупреждения. В таком случае диспетчер ресурсов может вызвать TmRequestOutcomeEnlistment.
Закройте дескриптор объекта регистрации.
После завершения обработки транзакции диспетчер ресурсов должен вызвать ZwClose, чтобы закрыть дескриптор объекта участия.
Закройте дескриптор объекта диспетчера ресурсов и дескриптор объекта диспетчера транзакций.
Перед выгрузкой диспетчера ресурсов необходимо вызвать ZwClose, чтобы закрыть дескриптор объекта диспетчера ресурсов и дескриптор объекта диспетчера транзакций.
Шаги 1–5 должны выполняться в коде инициализации диспетчера ресурсов. Например, если диспетчер ресурсов является драйвером режима ядра, код инициализации — это подпрограмма DriverEntry драйвера.
Шаги 6–11 обычно выполняются в коде, который отвечает на запросы от транзакционных клиентов.
Шаг 12 должен выполняться в окончательном коде очистки диспетчера ресурсов, например подпрограмме выгрузки драйвера в режиме ядра.
Создание Read-Only перечисления
Регистрация только для чтения — это регистрация, которая не получает никаких уведомлений от KTM. Диспетчер ресурсов может сделать любой список доступных только для чтения, вызвав ZwReadOnlyEnlistment. Этот вызов приводит к тому, что KTM прекращает доставку уведомлений диспетчеру ресурсов.
После вызова ZwCreateEnlistment диспетчер ресурсов может вызывать ZwReadOnlyEnlistment в любое время до точки, в которой он обычно вызывает ZwPrepareComplete.
Существует две причины, по которым вы могли бы захотеть, чтобы ваш диспетчер ресурсов вызвал ZwReadOnlyEnlistment.
Диспетчер ресурсов участвует в транзакции, и в какой-то момент, прежде чем он получит уведомление TRANSACTION_NOTIFY_COMMIT, диспетчер ресурсов определяет, что он больше не должен участвовать в операции фиксации транзакции.
Например, когда диспетчер ресурсов получает уведомление TRANSACTION_NOTIFY_PREPARE, он может определить, что ни одна из операций транзакции не изменила базу данных диспетчера ресурсов. Диспетчер ресурсов может вызывать ZwReadOnlyEnlistment вместо ZwPrepareComplete, чтобы удалить себя из транзакции.
Диспетчер ресурсов никогда не участвует в операции фиксации транзакции.
Например, диспетчер ресурсов может отслеживать данные, отправляемые клиентом, не изменяя хранимую базу данных. В этом случае диспетчер ресурсов может вызывать ZwReadOnlyEnlistment сразу после вызова ZwCreateEnlistment. Кроме того, можно сделать такого диспетчера ресурсов volatile, как описано в следующем разделе этой темы.
После вызова ZwReadOnlyEnlistment менеджер ресурсов может вызвать ZwClose, чтобы закрыть дескриптор участия.
Создание менеджера Volatile-Resource
Диспетчер переменных ресурсов — это диспетчер ресурсов , который не поддерживает устойчивые данные. Например, можно создать диспетчер переменных ресурсов для отслеживания данных, отправляемых клиентом, если диспетчер ресурсов не изменяет защищенную базу данных. Диспетчеры переменных ресурсов обычно не регистрируют действия транзакций и поэтому не могут выполнять операции восстановления или отката.
Диспетчер переменных ресурсов должен задать флаг RESOURCE_MANAGER_VOLATILE при вызове ZwCreateResourceManager. Если этот флаг задан, KTM не регистрирует никаких сведений о диспетчере ресурсов в потоке журналов связанного объекта диспетчера транзакций.
Диспетчер ресурсов также может задать флаг TRANSACTION_MANAGER_VOLATILE при вызове ZwCreateTransactionManager. Если этот флаг задан, KTM не создает поток журналов для объекта диспетчера транзакций. Кроме того, все дополнительные диспетчеры ресурсов, подключенные к объекту диспетчера транзакций, также должны быть переменными и задавать флаг RESOURCE_MANAGER_VOLATILE.
Добавление менеджера ресурсов в существующий TPS
Если вам нужно добавить дополнительный диспетчер ресурсов в существующий TPS, у вас есть два варианта:
Новый диспетчер ресурсов вызывает ZwCreateTransactionManager для создания собственного объекта диспетчера транзакций.
Используйте этот выбор, если диспетчер ресурсов не взаимодействует с другими диспетчерами ресурсов в TPS.
Новый диспетчер ресурсов вызывает ZwOpenTransactionManager для подключения к существующему объекту диспетчера транзакций.
Используйте этот выбор, если диспетчер ресурсов должен взаимодействовать с другими диспетчерами ресурсов в TPS. Диспетчер ресурсов, вызывающий ZwCreateTransactionManager , должен совместно использовать GUID объекта диспетчера транзакций, имя потока журнала или имя объекта, чтобы другие диспетчеры ресурсов могли вызывать ZwOpenTransactionManager. Эти другие диспетчеры ресурсов могут вызывать ZwQueryInformationTransactionManager , чтобы получить дополнительные сведения об объекте диспетчера транзакций.
После добавления диспетчера ресурсов в TPS клиенты, которые знают о диспетчере ресурсов, могут вызывать клиентский интерфейс диспетчера ресурсов.