NDB 集群内部结构  /  NDB 通信协议  /  操作和信号

3.3 操作和信号

在本节中,我们将讨论以下每个操作在数据节点和 API 节点之间进行的消息传递序列:

  • 主键查找

  • 唯一键查找

  • 表扫描或索引扫描

  • 显式提交事务

  • 回滚事务

  • 事务记录处理(获取和释放)

**主键查找。** 使用主键查找的操作按以下图表所示执行:

图 3.1 主键查找中交换的消息

Content is described in the surrounding text.

注意

*+ 在此处分别表示 零个或多个一个或多个

构成此过程的步骤在此处列出并进行了更详细的说明:

  1. API 节点向数据节点发送 TCKEYREQ 消息。如果要使用的键的必要信息太大而无法包含在 TCKEYREQ 中,则该消息可以伴随任意数量的 KEYINFO 消息,这些消息携带剩余的键信息。如果操作中使用了其他属性,并且超出了 TCKEYREQ 中可用的空间,或者如果数据将作为写入操作的一部分发送到数据节点,则这些属性将与 TCKEYREQ 一起作为任意数量的 ATTRINFO 消息发送。

  2. 数据节点根据操作是成功还是失败发送响应消息:

    • 如果操作成功,则数据节点向 API 节点发送 TCKEYCONF 消息。如果请求是读取操作,则 TCKEYCONF 伴随一个 TRANSID_AI 消息,该消息包含实际结果数据。如果数据量超过单个 TRANSID_AI 可以携带的数据量,则可以发送多个此类消息。

    • 如果操作失败,则数据节点向 API 节点发送 TCKEYREF 消息,并且在 API 节点发出新请求之前不再进行任何信号传递。

**唯一键查找。** 这以与主键查找中执行的方式类似的方式执行:

  1. API 节点使用 TCINDXREQ 消息发出请求,该消息可以伴随零个或多个 KEYINFO 消息、零个或多个 ATTRINFO 消息,或两者兼有。

  2. 数据节点返回响应,具体取决于操作是否成功:

    • 如果操作成功,则消息为 TCINDXCONF。对于成功的读取操作,此消息可以伴随一个或多个携带结果数据的 TRANSID_AI 消息。

    • 如果操作失败,则数据节点返回 TCINDXREF 消息。

下图说明了唯一键查找中涉及的消息交换:

图 3.2 唯一键查找中交换的消息

Content is described in the surrounding text.

**表扫描和索引扫描。** 这些在许多方面类似于主键和唯一键查找,如下所示:

图 3.3 表扫描或索引扫描操作中交换的消息。

Content is described in the surrounding text.

  1. API 节点使用 SCAN_TABREQ 消息以及零个或多个 ATTRINFO 消息发出请求。如果使用边界,则索引扫描也会使用 KEYINFO 消息。

  2. 数据节点返回响应,具体取决于操作是否成功:

    • 如果操作成功,则消息为 SCAN_TABCONF。对于成功的读取操作,此消息可以伴随一个或多个携带结果数据的 TRANSID_AI 消息。但是,与基于主键或唯一键的查找不同,通常需要从数据节点获取多个结果。API 节点使用 SCAN_NEXTREQ 信号通知第一个请求之后的请求,该请求告诉数据节点发送下一组结果(如果有更多结果)。如下所示:

      图 3.4 在表或索引扫描读取操作后获取多个结果数据集

      Content is described in the surrounding text.

    • 如果操作失败,则数据节点返回 SCAN_TABREF 消息。

      SCAN_TABREF 还用于向 API 节点发送信号,指示已发送读取产生的所有数据。

**提交和回滚事务。** 执行显式提交的过程遵循与前面所示相同的通用模式。API 节点向数据节点发送 TC_COMMITREQ 消息,数据节点以 TC_COMMITCONF(成功时)或 TC_COMMITREF(提交失败时)进行响应。这在下图中显示:

图 3.5 显式提交操作中交换的消息

Content is described in the surrounding text.

注意

某些操作会自动执行 COMMIT,因此并非每个事务都需要这样做。

回滚事务也遵循此模式。但是,在这种情况下,API 节点向数据节点发送 TCROLLBACKTREQ 消息。将发送 TCROLLACKCONFTCROLLBACKREF 作为响应,如下所示:

图 3.6 回滚事务时交换的消息

Content is described in the surrounding text.

**事务记录的处理。** 当 API 节点向数据节点发送 TCSEIZEREQ 消息并接收 TCSEIZECONFTCSEIZEREF 作为响应时(取决于请求是否成功),即可获取事务记录。这在此处描述:

Signals used in transaction record acquisition

事务记录的释放也使用请求-响应模式进行处理。在这种情况下,API 节点的请求包含 TCRELEASEREQ 消息,而数据节点的响应使用 TCRELEASECONF(指示记录已释放)或 TCRELEASEREF(指示释放尝试未成功)。这一系列事件在下图中进行了说明:

Signals used in releasing a transaction record