Создание транзакционного клиента

Транзакционный клиент — это компонент системы обработки транзакций (TPS), который использует экспортируемый интерфейс диспетчера ресурсов для доступа к ресурсу, например к базе данных, который поддерживает диспетчер ресурсов.

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

Как правило, транзакционный клиент, использующий режим ядра KTM, должен выполнять следующие задачи для каждой транзакции:

  1. Создайте объект транзакции.

    Вызов ZwCreateTransaction создает объект транзакции, предоставляет дескриптор объекта и назначает идентификатор объекта (GUID), который клиент может передать диспетчеру ресурсов для идентификации транзакции.

  2. Получите идентификатор объекта транзакции.

    Клиент может вызвать ZwQueryInformationTransaction для получения идентификатора объекта.

  3. Передайте идентификатор объекта транзакции диспетчеру ресурсов.

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

  4. Выполнение операций, которые будут включены в транзакцию.

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

  5. Фиксация или откат транзакции.

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

    Клиенты могут вызывать ZwCommitTransaction и ZwRollbackTransaction синхронно или асинхронно. Если клиенты вызывают эти подпрограммы синхронно, подпрограммы не возвращаются до завершения операции фиксации или отката.

    Дополнительные сведения о фиксации и откате транзакций см. в разделе Обработка транзакционных операций.

  6. Закройте дескриптор объекта транзакции.

    После завершения обработки транзакции клиент должен вызвать ZwClose , чтобы закрыть дескриптор объекта транзакции.

TPS может включать несколько диспетчеров ресурсов. Если транзакция клиента включает операции с несколькими ресурсами, например с двумя базами данных, которые поддерживаются двумя диспетчерами ресурсов, клиент обычно выполняет следующие действия:

  1. Создает один объект транзакции для каждой транзакции.

  2. Передает идентификатор объекта транзакции каждому диспетчеру ресурсов.

  3. Выполняет операции с каждой базой данных, вызывая интерфейс каждого диспетчера ресурсов.

  4. Фиксирует транзакцию, если все операции завершены без ошибок, или откатывает транзакцию при обнаружении ошибки.

Если ваш TPS включает в себя диспетчер транзакций высокого уровня, транзакционные клиенты обычно не вызывают KTM. Дополнительные сведения о превосходных диспетчерах транзакций и их клиентах см. в разделе Создание диспетчера транзакций уровня "Улучшенный".

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