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


Уведомления о транзакциях

KTM предоставляет очередь уведомлений для каждого диспетчера ресурсов. KTM доставляет уведомления диспетчеру ресурсов, помещая их в очередь диспетчера ресурсов.

Диспетчер ресурсов может получать уведомления из своей очереди синхронно или асинхронно.

  • Для синхронного получения уведомлений диспетчер ресурсов может многократно вызывать ZwGetNotificationResourceManager.

  • Чтобы асинхронно получать уведомления, диспетчер ресурсов может вызвать TmEnableCallbacks , чтобы настроить подпрограмму обратного вызова. KTM вызывает подпрограмму обратного вызова каждый раз, когда она помещает уведомление в очередь диспетчера ресурсов.

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

Константы уведомлений определены в Ktmtypes.h. Имена констант уведомлений имеют формат TRANSACTION_NOTIFY_Xxx.

В оставшейся части этого раздела перечислены все константы уведомлений, определяемые Ktmtypes.h, и они разделены на три группы:

  • Уведомления, которые могут получать диспетчеры ресурсов

  • Уведомления, которые могут получать лучшие диспетчеры транзакций

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

Уведомления для диспетчеров ресурсов

Все диспетчеры ресурсов должны зарегистрироваться для получения уведомлений TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE и TRANSACTION_NOTIFY_COMMIT, даже если впоследствии они вызывают ZwReadOnlyEnlistment , чтобы пометить зачисление как доступное только для чтения.

Диспетчеры ресурсов могут поддерживать TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT, но они также должны поддерживать многоэтапную предварительную подготовку, подготовку и фиксацию уведомлений.

В следующем списке содержатся все уведомления, которые могут получать диспетчеры ресурсов:

TRANSACTION_NOTIFY_PREPREPARE
При отправке: клиент вызывает ZwCommitTransaction , и ни один диспетчер ресурсов не поддерживает однофазную фиксацию, или если более высокий диспетчер транзакций вызывает ZwPrePrepareEnlistment.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя: выполните операции предварительной подготовки, а затем вызовите ZwPrepareComplete. (Дополнительные сведения об операциях предварительной подготовки см. в разделе Обработка операций фиксации.)

Ограничения: Диспетчер ресурсов также должен поддерживать TRANSACTION_NOTIFY_PREPARE и TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_PREPARE
При отправке: после TRANSACTION_NOTIFY_PREPREPARE, если клиент вызывает ZwCommitTransaction и ни один диспетчер ресурсов не поддерживает однофазную фиксацию, или если более высокий диспетчер транзакций вызывает ZwPrepareEnlistment.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя: Выполните операции подготовки, а затем вызовите ZwPrepareComplete. (Дополнительные сведения об операциях подготовки см. в разделе Обработка операций фиксации.)

Ограничения: Диспетчер ресурсов также должен поддерживать TRANSACTION_NOTIFY_PREPREPARE и TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_COMMIT
При отправке: после TRANSACTION_NOTIFY_PREPARE, если клиент вызывает ZwCommitTransaction и ни один диспетчер ресурсов не поддерживает однофазную фиксацию, или если более высокий диспетчер транзакций вызывает ZwCommitEnlistment.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя. Выполните операции фиксации, а затем вызовите ZwCommitComplete. (Дополнительные сведения об операциях фиксации см. в разделе Обработка операций фиксации.)

Ограничения: Диспетчер ресурсов также должен поддерживать TRANSACTION_NOTIFY_PREPREPARE и TRANSACTION_NOTIFY_PREPARE.

TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT
При отправке клиент вызывает ZwCommitTransaction , а диспетчер ресурсов поддерживает однофазные операции фиксации.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя: зафиксируйте транзакцию или вызовите ZwSinglePhaseReject. (Дополнительные сведения об однофазных операциях фиксации см. в разделе Обработка операций фиксации.)

Ограничения: Диспетчер ресурсов также должен поддерживать TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE и TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_ROLLBACK
При отправке: клиент вызывает ZwRollbackTransaction, более высокий диспетчер транзакций вызывает ZwRollbackEnlistment, или KTM обнаруживает ошибку (например, сбой записи в поток журнала).

Получено: как диспетчерами ресурсов, так и вышестоящими диспетчерами транзакций.

Обязательное действие получателя. Выполните все операции, необходимые для отката данных транзакции, а затем вызовите ZwRollbackComplete. (Дополнительные сведения об операциях отката см. в разделе Обработка операций отката.)

Ограничения: Все диспетчеры ресурсов и вышестоящие диспетчеры транзакций должны поддерживать TRANSACTION_NOTIFY_ROLLBACK.

TRANSACTION_NOTIFY_RECOVER
При отправке: диспетчер ресурсов вызывает ZwRecoverResourceManager.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя. Диспетчер ресурсов должен вызвать ZwRecoverEnlistment. (Дополнительные сведения об операциях восстановления см. в разделе Обработка операций восстановления.)

Ограничения. Нет.

TRANSACTION_NOTIFY_LAST_RECOVER
Когда отправлено: после отправки KTM последнего TRANSACTION_NOTIFY_RECOVER для зачисления диспетчера ресурсов.

Получено: Диспетчеры ресурсов.

Обязательное действие получателя. Завершите операцию восстановления. (Дополнительные сведения об операциях восстановления см. в разделе Обработка операций восстановления.)

Ограничения. Нет.

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

Получено: Диспетчеры ресурсов.

Обязательное действие получателя: ничего не делать, пока KTM не отправит TRANSACTION_NOTIFY_COMMIT или TRANSACTION_NOTIFY_ROLLBACK.

Ограничения. Нет.

TRANSACTION_NOTIFY_RM_DISCONNECTED
При отправке: диспетчер ресурсов, обрабатывающий однофазную операцию фиксации, закрывает дескриптор зачисления, не указывая, что транзакция зафиксирована или откатилась.

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

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

Ограничения. Нет.

Уведомления для диспетчеров транзакций высшего звена

Диспетчеры транзакций высшего звена могут получать следующие уведомления:

TRANSACTION_NOTIFY_ROLLBACK
См. более раннее описание.

TRANSACTION_NOTIFY_RM_DISCONNECTED
См. более раннее описание.

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
При отправке: после того, как все диспетчеры ресурсов получили TRANSACTION_NOTIFY_PREPREPARE и ответили, вызвав ZwPrePrepareComplete.

Получено: диспетчерами транзакций высшего звена.

Обязательное действие получателя. Вышестоящий диспетчер транзакций должен вызвать ZwPrepareEnlistment.

TRANSACTION_NOTIFY_PREPARE_COMPLETE
При отправке: после того, как все диспетчеры ресурсов получили TRANSACTION_NOTIFY_PREPARE и ответили, вызвав ZwPrepareComplete.

Получено: диспетчерами транзакций высшего звена.

Обязательное действие получателя. Вышестоящий диспетчер транзакций должен вызвать ZwCommitEnlistment.

TRANSACTION_NOTIFY_COMMIT_COMPLETE
При отправке: после того, как все диспетчеры ресурсов получили TRANSACTION_NOTIFY_COMMIT и ответили, вызвав ZwCommitComplete.

Получено: диспетчерами транзакций высшего звена.

Обязательное действие получателя: операции очистки транзакций.

TRANSACTION_NOTIFY_ROLLBACK_COMPLETE
При отправке: после того, как все диспетчеры ресурсов получили TRANSACTION_NOTIFY_ROLLBACK и ответят, вызвав ZwRollbackComplete.

Получено: превосходными диспетчерами транзакций.

Обязательное действие получателя: операции очистки транзакций.

TRANSACTION_NOTIFY_RECOVER_QUERY
При отправке: улучшенный диспетчер транзакций вызывает ZwRecoverResourceManager.

Получено: превосходными диспетчерами транзакций.

Обязательное действие получателя. Для зачисления вышестоящий диспетчер транзакций должен вызвать ZwCommitEnlistment или ZwRollbackEnlistment .

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

Получено: превосходными диспетчерами транзакций.

Обязательное действие получателя. Вышестоящий диспетчер транзакций вызывает ZwCommitEnlistment.

TRANSACTION_NOTIFY_REQUEST_OUTCOME
При отправке: диспетчер ресурсов вызывает TmRequestOutcomeEnlistment , когда транзакция находится в подготовленном состоянии.

Получено: превосходными диспетчерами транзакций.

Обязательное действие получателя. Вышестоящий диспетчер транзакций должен вызвать ZwCommitEnlistment или ZwRollbackEnlistment.

Неиспользуемые уведомления

Следующие уведомления определены в Ktmtypes.h, но KTM в настоящее время не поддерживает их:

TRANSACTION_NOTIFY_DELEGATE_COMMIT

TRANSACTION_NOTIFY_ENLIST_MASK

TRANSACTION_NOTIFY_ENLIST_PREPREPARE

TRANSACTION_NOTIFY_MARSHAL

TRANSACTION_NOTIFY_PROMOTE

TRANSACTION_NOTIFY_PROMOTE_NEW

TRANSACTION_NOTIFY_PROPAGATE_PULL

TRANSACTION_NOTIFY_PROPAGATE_PUSH

TRANSACTION_NOTIFY_TM_ONLINE

TRANSACTION_NOTIFY_COMMIT_FINALIZE