2.3.24 NdbScanOperation类

本节提供有关 NdbScanOperation该类的信息。

NdbScanOperation 类概述

家长班

NdbOperation

儿童班

NdbIndexScanOperation

描述

该类NdbScanOperation表示事务中使用的扫描操作。此类继承自NdbOperation.

方法

下表列出了该类的公共方法以及每个方法的用途或用途:

表 2.61 NdbScanOperation 类方法及说明

姓名 描述
close() 关闭扫描
deleteCurrentTuple() 删除当前元组
lockCurrentTuple() 锁定当前元组
nextResult() 获取下一个元组
getNdbTransaction() 获取NdbTransaction本次扫描的对象
getPruned() 用于查明此扫描是否被修剪为单个分区
readTuples() 读取元组
restart() 重新开始扫描
updateCurrentTuple() 更新当前元组

此类没有公共构造函数。要创建 的实例NdbScanOperation,必须使用 NdbTransaction::getNdbScanOperation() 方法。

类型

此类定义了两个公共类型,列于此处:

有关使用 的更多信息 NdbScanOperation,请参阅 第 1.4.2.3.3 节“扫描操作”第 1.4.2.3.4 节“使用扫描更新或删除行”

NdbScanOperation::关闭()

描述

调用此方法关闭扫描。使用此方法关闭扫描后,此扫描返回的行将不再可用。

请参阅 使用独占锁扫描,了解有关多个线程尝试使用独占锁执行相同扫描的信息,以及这如何影响关闭扫描。

签名
void close
    (
      bool forceSend = false,
      bool releaseOp = false
    )
参数

此方法采用此处列出的两个参数:

  • forceSend默认为 false; 调用 close()此参数设置为 true以强制发送事务。

  • releaseOp也默认为 false; 将其设置 true为以释放操作。

    在 NDB 7.3.8 之前, NdbScanOperation在拥有扫描操作关闭之前,由 an 分配的用于接收扫描行的缓冲区不会被释放 NdbTransaction(错误#75128,错误#20166585)。在 NDB Cluster 的这些版本和后续版本中,无论参数的值如何,只要使用该 close()方法关闭导航结果集的游标,就会释放缓冲区releaseOp

返回值

没有

NdbScanOperation::deleteCurrentTuple() 函数

描述

该方法用于删除当前元组。

签名
const NdbOperation* deleteCurrentTuple
    (
      NdbTransaction* takeOverTrans,
      const NdbRecord* record,
      char* row = 0,
      const unsigned char* mask = 0,
      const NdbOperation::OperationOptions* opts = 0,
      Uint32 sizeOfOpts = 0
    )

有关详细信息,请参阅第 2.3.22 节,“NdbRecord 接口”

参数

NdbRecord接口一起使用时,此方法采用此处列出的参数:

  • takeOverTrans应该执行锁 的事务( );与扫描一起使用 NdbRecord时,此参数不是可选的。

  • 扫描所NdbRecord 引用的。这个 record值是必需的,即使没有记录被读取。

  • row从中读取 。NULL如果不进行读取 ,则将其设置为。

  • mask指针是可选 的。如果存在,则扫描仅检索掩码中设置了相应位的列。

  • OperationOptions ( opts) 可用于提供更细粒度的操作定义控制。传递的 OperationOptions结构带有标志,指示存在哪些操作定义选项。并非所有操作类型都支持所有操作选项;下表显示了每种类型的操作支持的选项:

    表 2.62 NdbRecord OperationOptions 的操作类型

    操作类型(方法) OperationOptions支持的标志
    readTuple() OO_ABORTOPTION, OO_GETVALUE, OO_PARTITION_ID, OO_INTERPRETED
    insertTuple() OO_ABORTOPTION, OO_SETVALUE, OO_PARTITION_ID, OO_ANYVALUE
    updateTuple() OO_ABORTOPTION, OO_SETVALUE, OO_PARTITION_ID, OO_INTERPRETED, OO_ANYVALUE
    writeTuple() OO_ABORTOPTION, OO_SETVALUE, OO_PARTITION_ID, OO_ANYVALUE
    deleteTuple() OO_ABORTOPTION, OO_GETVALUE, OO_PARTITION_ID, OO_INTERPRETED, OO_ANYVALUE

  • 可选sizeOfOptions 参数用于保持此接口与以前的 OperationOptions 结构定义的向后兼容性。如果接口实现检测到异常大小,它可以使用它来确定如何解释传递的 OperationOptions结构。要启用此功能,调用者应传递 sizeof(NdbOperation::OperationOptions) 此参数的值。

  • 如果指定了选项,则还sizeOfOpts必须指定它们的长度 ( )。

返回值

返回0成功或 -1失败。

NdbScanOperation::getNdbTransaction() 函数

描述

获取NdbTransaction 此扫描的对象。

签名
NdbTransaction* getNdbTransaction
    (
      void
    ) const
参数

没有

返回值

指向 NdbTransaction对象的指针。

NdbScanOperation::getPruned()

描述

此方法用于确定给定的扫描操作是否已被修剪为单个分区。对于使用 NdbRecord 定义的扫描,可以在执行扫描之前或之后调用此方法。对于未使用 定义 的扫描NdbRecordgetPruned()仅在执行扫描后才有效。

签名
bool getPruned
    (
      void
    ) const
参数

没有

返回值

true如果扫描被修剪为单个表分区,则 返回。

NdbScanOperation::lockCurrentTuple() 函数

描述

此方法锁定当前元组。

签名

可以通过此处显示的两种方式之一使用可选的单个参数调用此方法:

NdbOperation* lockCurrentTuple
    (
      void
    )

NdbOperation* lockCurrentTuple
    (
      NdbTransaction* lockTrans
    )

使用时,此方法还支持以下签名NdbRecord

NdbOperation *lockCurrentTuple
    (
      NdbTransaction* takeOverTrans,
      const NdbRecord* record,
      char* row = 0,
      const unsigned char* mask = 0
    )

此方法还支持指定一个或多个 OperationOptions (使用时也是如此 NdbRecord):

NdbOperation *lockCurrentTuple
    (
      NdbTransaction* takeOverTrans,
      const NdbRecord* record,
      char* row = 0,
      const unsigned char* mask = 0,
      const NdbOperation::OperationOptions* opts = 0,
      Uint32 sizeOfOptions = 0
    )
参数(没有 NdbRecord)

此方法采用单个可选参数——应该执行锁定的事务。如果省略,则交易是当前交易。

参数(使用 NdbRecord)

使用NdbRecord 接口时,此方法采用这些参数,如下表所述:

  • takeOverTrans应该执行锁 的事务( );与扫描一起使用 NdbRecord时,此参数不是可选的。

  • 扫描所NdbRecord 引用的。这是必需的,即使没有记录正在被读取。

  • row从中读取 。NULL如果不进行读取 ,则将其设置为。

  • mask指针是可选 的。如果存在,则扫描仅检索掩码中设置了相应位的列。

  • opts参数可以采用以下任何 OperationOptions 值:OO_ABORTOPTIONOO_GETVALUEOO_ANYVALUE

  • 如果指定了选项,则还sizeOfOptions必须指定它们的长度 ( )。

在 -style 扫描上调用NdbRecord扫描锁接管 NdbRecAttr是无效的,在 NdbRecAttr-style 扫描上调用 -style 扫描锁接管 也是无效的NdbRecord

返回值

此方法返回指向 NdbOperation对象的指针,或 NULL.

NdbScanOperation::nextResult() 函数

描述

此方法用于获取扫描事务中的下一个元组。在每次调用 之后 nextResult(),定义在 中的缓冲区和 NdbRecAttr对象都会NdbOperation::getValue() 使用扫描元组中的值进行更新。

当在nextResult()文件结束后执行时,NDB返回错误代码 4210(Ndb 发送的信息超过指定的长度)并且通过将额外的事务对象返回到正确的 TC 节点的空闲列表来释放它。

签名

可以通过以下两种方式之一调用此方法。其中第一个显示在这里:

int nextResult
    (
      bool fetchAllowed = true,
      bool forceSend = false
    )

也可以使用此方法,如下所示:

int nextResult
    (
      const char*& outRow,
      bool fetchAllowed = true,
      bool forceSend = false
    )
参数(2 参数版本)

此方法采用以下两个参数:

  • 通常,NDB API NDB会在必要时联系内核以获取更多元组;设置 fetchAllowedfalse防止这种情况发生。

    fetchAllowed通过将其设置为false强制 NDB处理其缓存中已有的任何记录来 禁用。当没有更多的缓存记录时,它返回2。然后,您必须 nextResult()使用 fetchAllowedequal to 来 调用,true以便联系 NDB以获取更多记录。

    nextResult(false)退货时 ,0您应该使用 将记录转移到另一笔交易 execute(NdbTransaction::NoCommit)nextResult(false)返回时 ,2您通常应该执行并提交其他事务。这会导致任何锁被转移到另一个事务,进行更新或删除,然后释放锁。在此之后,您可以调用 nextResult(true)以在 NDB API 中获取和缓存更多记录。

    笔记

    如果您不将记录转移到另一个事务,则在下次NDB 联系内核以获取更多记录时,将释放对这些记录的锁定。

    当您想要更新或删除在给定事务中获得的所有记录时,禁用fetchAllowed可能很有用,因为这样做可以节省时间并加快更新或删除扫描记录的速度。

  • forceSend默认为 false, 通常可以省略。但是,将此参数设置为 true意味着立即发送事务。有关详细信息,请参见 第 1.4.4 节“自适应发送算法”

参数(3 参数版本)

也可以使用以下三个参数调用此方法:

  • 调用nextResult()设置指向下一行的指针outRow(如果返回 0)。该指针(仅)在下一次调用为真之前nextResult()有效 fetchAllowed。定义行格式的 NdbRecord对象必须事先使用 NdbTransaction::scanTable() (或 NdbTransaction::scanIndex().

  • 当为 false 时,fetchAllowed 强制NDB处理其缓存中已有的任何记录。有关更多详细信息,请参阅前面的 参数小节中对此参数的描述。

  • 设置forceSendtrue表示立即发送事务,如前面的 参数小节以及第 1.4.4 节“自适应发送算法”中所述。

返回值

此方法返回以下 4 个整数值之一,解释如下表所示:

  • -1:表示发生了错误。

  • 0: 收到另一个元组。

  • 1: 没有更多的元组要扫描。

  • 2:没有更多的缓存记录(调用nextResult(true)以获取更多记录)。

例子

请参阅第 2.5.5 节,“NDB API 基本扫描示例”

NdbScanOperation::readTuples()

描述

此方法用于执行扫描。

签名
virtual int readTuples
    (
      LockMode mode = LM_Read,
      Uint32   flags = 0,
      Uint32   parallel = 0,
      Uint32   batch = 0
    )
参数

此方法采用此处列出的四个参数:

  • mode;这是一个 LockMode 值。

    使用独占锁扫描。  使用独占锁扫描时,必须格外小心,因为如果两个线程同时在同一范围内执行此扫描,则很可能导致死锁。如果扫描也是有序的(即使用 SF_OrderByor SF_Descending),则死锁的可能性会增加。

    NdbScanOperation::close() 方法也受此死锁的影响,因为所有未完成的请求都在扫描实际关闭之前得到服务。

  • 一个或多个 ScanFlag 值。多个值 OR组合在一起

  • 要扫描的片段数 parallel;用于 0要求使用最大可能的数量。

  • 该参数指定下一个 方法调用batch将有多少条记录从服务器返回给客户端 。NdbScanOperation::nextResult(true)用于0自动指定最大值。

返回值

0成功 返回,-1失败返回。

NdbScanOperation::restart()

描述

使用此方法重新启动扫描而不更改其任何getValue()调用或搜索条件。

签名
int restart
    (
      bool forceSend = false
    )
参数

调用此方法并forceSend 设置为true以强制发送交易。

返回值

0成功时;-1失败时。

NdbScanOperation::ScanFlag

本节提供有关 ScanFlag数据类型的信息。

描述

这种类型的值是与该 readTuples()方法一起使用的扫描标志。可以使用多个,在这种情况下,它们OR一起作为该方法的第二个参数。有关详细信息,请参阅 NdbScanOperation::readTuples()

枚举值

下表显示了可能的值以及说明:

表 2.63 NdbScanOperation::ScanFlag 值和描述

价值 描述
SF_TupScan 按 T​​UP 顺序扫描(即按内存中行的顺序)。仅适用于表扫描。
SF_DiskScan 按磁盘顺序扫描(磁盘上的行顺序)。仅适用于表扫描。
SF_OrderBy

有序索引扫描(升序);从索引扫描返回的行已排序,并按索引键排序。升序或降序扫描受此标志影响,这会导致 API 在每个片段的有序扫描中执行合并排序以获得单个排序结果集。

注意事项

  • 有序索引是分布式的,一个表的每个片段都有一个有序索引。

  • 范围扫描通常在所有索引片段中是并行的。有时,它们可以被修剪为一个索引片段。

  • 每个索引片段范围扫描都可以按升序或降序返回结果。升序是默认值;要选择降序,请设置SF_Descending 标志。

  • 当并行扫描多个索引片段时,结果将发送回 NDB,在返回给用户之前,可以选择对它们进行合并排序。此合并排序是使用 SF_OrderBySF_OrderByFull标志控制的。

  • 如果不使用SF_OrderByor SF_OrderByFull,则每个索引片段的结果按顺序排列(升序或降序),但不同片段的结果可能会交错。

  • 使用SF_OrderByor 时SF_OrderByFull,会在内部施加一些额外的约束;这些列在这里:

    1. 如果范围扫描未被修剪为一个索引片段,则必须并行扫描所有索引片段。(可以在低于完全并行度的情况下执行无序扫描。)

    2. 每个索引片段的结果在返回任何行之前必须可用,以确保正确的合并排序。这序列化了扫描的滚动,可能导致较低的行吞吐量。

    3. 无序扫描可以在所有索引片段返回任何批次之前将行返回给 API 客户端,并且可以将下一批请求与行处理重叠。

SF_OrderByFull 这与 相同SF_OrderBy,只是所有键列都自动添加到读取位掩码。
SF_Descending 导致按降序执行有序索引扫描。
SF_ReadRangeNo 对于索引扫描,当这个标志被设置时, NdbIndexScanOperation::get_range_no() 可以调用来回读 range_no定义在 NdbIndexScanOperation::setBound(). 此外,当设置 SF_OrderBy或 设置此标志时SF_OrderByFull,范围的结果将在从后续范围返回任何结果之前完整返回。
SF_MultiRange 表示此扫描是多范围扫描的一部分;每个范围被单独扫描。
SF_KeyInfo 请求KeyInfo返回给调用者。lockCurrentTuple()通过确保内核发回识别行和锁所需的信息,这使得可以选择接管扫描获取的行锁,使用 ,。对于使用 的扫描,此标志默认启用 LM_Exclusive,但必须明确指定才能接管 LM_Read锁。(有关更多信息,请参阅 LockMode 文档。)

NdbScanOperation::扫描选项

本节提供有关 ScanOptions数据结构的信息。

家长班

NdbScanOperation

描述

此数据结构用于将选项传递给类的 NdbRecord基 类scanTable()scanIndex() 方法 NdbTransaction。通过在字段中设置相应的位来将每个选项类型标记为存在optionsPresent 。只有 optionsPresent字段中标记的选项类型需要有敏感数据。

ScanOptions 在操作定义时,所有数据都从结构(和任何对向结构)中 复制出来。如果不需要选项,则 NULL可以作为 ScanOptions指针传递。

成员

构成该结构的元素如下表所示:

表 2.64 NdbScanOperation::ScanOptions 属性,带有类型和描述

姓名 类型 描述
optionsPresent Uint64 存在哪些选项。
[...] Type:
  • SO_SCANFLAGS: 0x01

  • SO_PARALLEL: 0x02

  • SO_BATCH: 0x04

  • SO_GETVALUE: 0x08

  • SO_PARTITION_ID: 0x10

  • SO_INTERPRETED: 0x20

  • SO_CUSTOMDATA: 0x40

  • SO_PARTINFO: 0x80

选项类型。
scan_flags Uint32 控制扫描行为的标志;有关详细信息,请参阅 NdbScanOperation::ScanFlag
parallel Uint32 扫描并行度;0(默认值)设置最大并行度。
batch Uint32 从数据节点到 API 节点传输的批量大小;0(默认值)使它能够被自动选择。
extraGetValues GetValueSpec 为匹配 sdcan 条件的每一行读取的额外值。
numExtraGetValues Uint32 要读取的额外值的数量。
partitionId Uint32 将扫描限制在具有此 ID 的分区;或者,您可以在 PartitionSpec 此处提供。对于索引扫描,可以为每个范围提供分区信息。
interpretedCode NdbInterpretedCode 作为扫描的一部分执行的解释代码。
customData void* 与此扫描操作关联的数据指针。
partitionInfo PartitionSpec 用于限制此扫描的分区信息。
sizeOfPartInfo Uint32 边界分区信息的大小。

有关详细信息,请参阅第 2.3.22 节,“NdbRecord 接口”

NdbScanOperation::updateCurrentTuple() 函数

描述

此方法用于更新当前元组。

签名

本来,这个方法可以用一个调用。可选参数,采用此处显示的任一方式:

NdbOperation* updateCurrentTuple
    (
      void
    )


NdbOperation* updateCurrentTuple
    (
      NdbTransaction* updateTrans
    )

也可以在使用 NdbRecord扫描时使用此方法,如下所示:

NdbOperation* updateCurrentTuple
    (
      NdbTransaction*      takeOverTrans,
      const NdbRecord*     record,
      const char*          row,
      const unsigned char* mask = 0
    )

有关更多信息,请参阅第 2.3.22 节,“NdbRecord 接口”

参数(原件)

此方法采用单个可选参数——应该执行锁定的事务。如果省略,则交易是当前交易。

参数(使用 NdbRecord)

使用NdbRecord 接口时,此方法采用以下参数,如下表所述:

  • 收购交易(takeOverTrans)。

  • 引用用于扫描的列 的record (对象)。NdbRecord

  • row从中读取 。如果没有要读取的属性,则将其设置为 NULL

  • mask指针是可选 的。如果存在,则扫描仅检索掩码中设置了相应位的列。

返回值

此方法返回一个 NdbOperation对象或 NULL