CICS 同步点管理器启动的 TRUE 的样本代码

此示例伪代码向您显示在同步点启动的任务相关用户出口可能需要检查的一些条件。

图 1。 要由 CICS 同步点管理器启动的任务相关用户出口程序的样本伪码
if UERTFID = UERTSYNC then       /* Caller is CICS syncpoint manager */
  select;                        /* Type of syncpoint manager request */
    when (UERTONLY)                          /* ONLY resource manager */
        invoke RM for single-phase commit    /* Single-phase commit */
        if RM single-phase commit succeeded then
          give CICS syncpoint manager 'YES' vote (UERFOK)
        else                         /* Single-phase commit failed */
                                     /* If RM completed backout */
          if RM single-phase commit failed and backed out
            give CICS syncpoint manager 'NO' vote (UERFBOUT)
          else                       /* Don't know what happened */
            put out message and issue transaction abend
          endif
        endif
    when (UERTELUW)                  /* RM read-only for current UOW */
        invoke RM for single-phase commit    /* Single-phase commit */
    when (UERTPREP)       /* Not ONLY resource manager, nor read-only */
        invoke RM for PREPARE  /* Prepare - phase 1 of 2-phase commit */
        select (resource manager vote)
          when (YES)                 /* Phase 1 completed */
            give CICS syncpoint manager 'YES' vote (UERFPREP)
          otherwise
            give CICS syncpoint manager 'NO' vote (UERFBACK)
        endselect
    when (UERTCOMM)             /* Commit - phase 2 of 2-phase commit */
      invoke RM for commit phase 2
      if RM commit succeeded then
        tell CICS sync manager OK (UERFDONE)
      else
        tell CICS sync manager remember could not commit (UERFHOLD)
      endif
    when (UERTBACK)                  /* Backout request */
      invoke RM for backout
      if RM backout succeeded then
        tell CICS sync manager OK (UERFDONE)
      else
        tell CICS sync manager remember could not backout (UERFHOLD)
      endif
    when (UERTWAIT)                  /* CICS indoubt about UOW */
      invoke RM to free thread
         (but maintain locks for UOW and record UOW is indoubt)
  endselect
endif

提高效率: 单更新和只读协议中所述,如果设置了 UERTONLY 位 (指示资源管理器是唯一具有更新资源的位) ,那么出口程序应使资源管理器执行单阶段落实。 如果落实成功,那么出口程序应在寄存器 15 中返回 "UERFOK"; 否则,它应返回 "UERFBOUT" ,这意味着落实失败并且资源已回退。 如果出口程序不确定单阶段落实的结果,那么它应该会异常终止该任务,因为它已保存或显示它认为必需的任何诊断信息。

注意,本节中的 "寄存器 15" 指的是同步点管理器的寄存器 15 ,是 UEPHMSA 所寻址的区域的第五个词。

同样,当设置 UERTELUW 位 (指示资源管理器在整个 UOW 中处于只读方式) 时,出口程序应使资源管理器执行单阶段落实。 UERTELUW 调用没有返回码。 由于未进行任何更新,因此数据完整性没有风险,因此在落实失败时不会执行任何操作。

在接收到执行两阶段落实的第一阶段的请求时,资源管理器将进入一种状态,即可以根据需要落实或回退自最后一个同步点以来所做的可恢复更改,即使发生中间系统故障也是如此。 例如,应该将缓冲区内容移至非易失性存储器。 如果资源管理器无法进入此状态,那么出口程序应在寄存器 15 中返回 "UERFBACK" 以请求回退。 通常,它应该返回 "UERFPREP" ,以指示 2 阶段落实的成功阶段 1。

在接收到等待请求 (指示 CICS 不确定 UOW 的结果) 时,资源管理器应释放任何与任务相关的资源,例如线程。 但是,它应该维护 UOW 持有的任何锁定,并记录 UOW 是不确定的。 请参阅 启用特定调用类型

在接收到执行两阶段落实的第二阶段或回退的请求时,资源管理器应执行相应的不可逆步骤,并使出口程序向同步点管理器发送返回码: "UERFDONE" ,表示落实或异常终止过程已完成; 或 "UERFHOLD" ,表示应稍后解决落实或异常终止。 当您在出口程序中对宏 DFHUEXIT TYPE=RM 进行编码时,这些返回码常量可供您使用。

如果资源管理器无法理解调用,那么在返回到调用者之前,它不应更改调用者的寄存器 15 的内容,因为它无法预测调用者如何解释更改。