处理提交操作
有两种类型的提交操作: 单阶段提交 和 多阶段提交。 单阶段提交操作包含资源管理器必须响应的单个通知,而多阶段提交操作包含准备步骤的其他通知。
单阶段提交操作更易于实现。 它适用于具有以下特征之一 (TPS) 事务处理系统:
单个资源管理器。
多个资源管理器(除其中一个之外)都是 只读 的,不参与提交操作。
如果多个资源管理器参与提交操作,则需要执行多阶段提交操作。
Single-Phase提交操作
如果希望 TPS 支持单阶段提交操作,则只有一个 (且只有一个) 资源管理器必须注册才能接收其登记TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 通知 。 所有其他资源管理器必须是 只读的。
包含 高级事务管理器 的 TPS 不能使用单阶段提交。
如果资源管理器已注册以接收TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知,则当事务客户端调用 ZwCommitTransaction 时,KTM 会发送此类通知。
当资源管理器收到事务TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知时,它可以提交事务或拒绝单阶段提交。
若要提交事务,资源管理器必须执行以下操作:
刷新非永久性缓存中保存的任何数据 (内存中存储) ,例如 CLFS 日志流的 CLFS封送区域。
资源管理器必须将数据从缓存移动到持久存储介质。 例如,使用 CLFS 的资源管理器可以调用 ClfsFlushBuffers。
使所有数据更改永久和公共 (,即在资源管理器) 范围之外可见。
调用 ZwCommitComplete。
调用 ZwCommitComplete 后,资源管理器应调用 ZwClose 以关闭登记句柄。
若要拒绝事务的单阶段提交操作,资源管理器可以调用 ZwSinglePhaseReject。 如果资源管理器调用 ZwSinglePhaseReject,KTM 会立即将提交操作从单阶段更改为多阶段。
如果其他资源管理器在同一事务中登记,则它们必须是 只读的。 但是,他们必须注册才能接收TRANSACTION_NOTIFY_RM_DISCONNECTED通知,如果正在处理单阶段提交操作的资源管理器关闭登记句柄而不指示它已提交或回滚事务,则会收到通知。
多阶段提交操作
发生以下事件之一时,将开始执行多阶段提交操作:
事务客户端调用 ZwCommitTransaction,并且没有资源管理器注册接收TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知。
资源管理器在收到TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT通知后调用 ZwSinglePhaseReject 。
多阶段提交操作由三个连续阶段组成: 预准备、 准备和 提交。
预准备阶段
当 KTM 向所有资源管理器发送TRANSACTION_NOTIFY_PREPREPARE通知时,提交操作的预准备阶段 (也称为 阶段零) 。 如果没有资源管理器支持事务的单阶段提交操作,或者高级事务管理器调用 ZwPrePrepareEnlistment,KTM 会发送此通知。
当每个资源管理器收到TRANSACTION_NOTIFY_PREPREPARE通知时,它必须执行以下操作:
刷新非永久性缓存中保存的任何数据 (内存中存储) ,例如 CLFS 日志流的 CLFS封送区域。
资源管理器必须将数据从缓存移动到持久存储介质。 例如,使用 CLFS 的资源管理器可以调用 ClfsFlushBuffers。
在资源管理器调用 ZwPreprepareComplete 后,它可以继续接收和处理客户端请求。 但资源管理器必须将所有数据修改视为立即写入持久存储介质的缓存直通操作。
如果资源管理器在处理TRANSACTION_NOTIFY_PREPREPARE通知时遇到错误,则应调用 ZwRollbackEnlistment 来回滚事务。
准备阶段
当 KTM 向所有资源管理器发送TRANSACTION_NOTIFY_PREPARE通知时,准备阶段 (也称为提交操作的第一 阶段) 开始。 如果没有资源管理器支持单阶段提交或高级事务管理器调用 ZwPrepareEnlistment,KTM 会在TRANSACTION_NOTIFY_PREPREPARE后发送此通知。
当每个资源管理器收到TRANSACTION_NOTIFY_PREPARE通知时,它必须执行以下操作:
停止为客户端请求提供服务,并将任何客户端后续请求报告为客户端错误。
确保所有数据都已移动到持久存储。
如果资源管理器在处理TRANSACTION_NOTIFY_PREPARE通知时遇到错误,则应调用 ZwRollbackEnlistment 来回滚事务。 但是,资源管理器在调用 ZwPrepareComplete 后无法回滚事务。
提交阶段
提交阶段 (也称为提交操作的第 二阶段) 在 KTM 向所有资源管理器发送TRANSACTION_NOTIFY_COMMIT通知时开始。 如果没有资源管理器支持单阶段提交,或者高级事务管理器调用 ZwCommitEnlistment,KTM 会在TRANSACTION_NOTIFY_PREPARE后发送此通知。
当每个资源管理器收到TRANSACTION_NOTIFY_COMMIT通知时,它必须执行以下操作:
使所有数据更改永久和公共 (,即对) 的其他事务可见。
通常,资源管理器通过将事务的保存数据从日志流复制到数据库的公共永久存储,使更改永久和公开。 有关如何使用日志流的详细信息,请参阅 将日志流与 KTM 配合使用。
调用 ZwCommitComplete。
资源管理器调用 ZwCommitComplete 后,应调用 ZwClose 以关闭登记句柄。
如果资源管理器在处理TRANSACTION_NOTIFY_COMMIT通知时遇到错误,则应自行关闭。 操作系统下次重新加载资源管理器时,资源管理器的 恢复过程 应将事务还原到错误发生前已知良好的状态。