ICrmLogControl::RegisterCompensator 方法 (comsvcs.h)

CRM 辅助角色使用此方法将 CRM 补偿器注册到 CRM 基础结构。 它必须是 CRM 辅助角色调用的第一个方法,并且只能成功调用一次。 如果 CRM 辅助角色在调用此方法时收到“正在恢复”错误代码,则应再次调用此方法,直到收到成功为止。

语法

HRESULT RegisterCompensator(
  [in] LPCWSTR lpcwstrProgIdCompensator,
  [in] LPCWSTR lpcwstrDescription,
  [in] LONG    lCrmRegFlags
);

参数

[in] lpcwstrProgIdCompensator

CRM 补偿器的 ProgId。 也接受字符串形式的 CRM 补偿器的 CLSID。

[in] lpcwstrDescription

监视接口要使用的说明字符串。

[in] lCrmRegFlags

CRMREGFLAGS 枚举中的标志,这些标志控制 CRM 补偿器应接收事务完成的阶段,以及尝试恢复后仍存在不确定的事务时,恢复是否应失败。

返回值

此方法可以返回以下值。

返回代码 说明
S_OK
该方法已成功完成。
E_POINTER
NULL 指针作为参数提供。
E_UNEXPECTED
发生意外错误。
XACT_E_NOTRANSACTION
创建 CRM clerk 的组件没有事务。
XACT_E_RECOVERYINPROGRESS
CRM 日志文件的恢复仍在进行中。
XACT_E_RECOVERY_FAILED
恢复 CRM 日志文件失败,因为存在可疑事务。
XACT_E_WRONGSTATE
调用此方法时处于错误状态;在 RegisterCompensator 之前或事务完成 (CRM 辅助角色) 。
E_OUTOFMEMORY
发生内存不足错误。
E_NOINTERFACE
CRM 补偿器不支持至少一个必需的接口 (ICrmCompensatorICrmCompensatorVariants) 。

注解

lCrmRegFlags 参数使实施者能够决定 CRM 补偿器要接收的事务完成阶段。 某些 CRM 补偿器可能在准备阶段不执行任何工作,因此无需接收准备通知;它可以提高性能,以指定在这种情况下不需要准备阶段。

建议将 CRM 辅助角色和 CRM 补偿器开发为“两者”线程组件, (线程模型 = 任何单元) 。 但是,在某些情况下,由于语言限制 ((例如,使用 Visual Basic) 开发 CRM 时),可能无法实现此操作。 单元线程 CRM 补偿器 (线程模型 = 单线程单元) 将在准备阶段死锁,除非其同步属性设置为“不支持”。 单元线程 CRM 补偿器的另一种替代方法是跳过准备阶段(如果没有必要)。

在具有多个分布式事务处理协调器 (DTC) 的情况下,DTC 事务可能会进入不确定状态。 通常,这是因为事务期间发生了中断,并且无法联系事务的发起人来了解事务的结果。 在这种情况下,CRM 基础结构无法确定事务的结果。 在这种情况下,CRM 实施者可以决定是否应允许新事务。

“如果存在疑问,则失败”标志的使用方式如下:通过在 RegisterCompensator 上指定“如果存在疑问,则失败”标志,如果恢复后仍保留有疑问的事务,则对 RegisterCompensator 的调用将失败并显示“恢复失败”错误代码。 如果未指定“如果存在疑问,则失败”标志,则恢复成功,允许新事务,并将有疑问的事务保留在 CRM 日志文件中。 当应用程序服务器进程重启) 时,CRM 基础结构会尝试在下一个恢复 (再次解决这些不确定事务。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 comsvcs.h

另请参阅

ICrmLogControl