本节提供有关 NdbScanOperation 类的信息。
- 父类
- 子类
- 描述
NdbScanOperation类表示事务中使用的扫描操作。此类继承自NdbOperation。- 方法
-
下表列出了此类的公共方法以及每个方法的用途
表 2.62 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 节 “使用扫描更新或删除行”。
- 描述
-
调用此方法将关闭扫描。使用此方法关闭扫描后,此扫描返回的行将不再可用。
有关多个线程尝试使用独占锁执行相同扫描以及这如何影响关闭扫描的信息,请参见 具有独占锁的扫描。
- 签名
void close ( bool forceSend = false, bool releaseOp = false )- 参数
-
此方法采用此处列出的两个参数
forceSend默认为false;通过将此参数设置为true来调用close(),以强制发送事务。-
releaseOp也默认为false;将其设置为true以释放操作。无论
releaseOp参数的值如何,只要使用close()方法关闭了导航结果集的游标,就会释放NdbScanOperation为接收扫描行而分配的缓冲区。
- 返回值
无.
- 描述
此方法用于删除当前元组。
- 签名
-
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.63 NdbRecord OperationOptions 的操作类型
操作类型(方法) OperationOptions支持的标志readTuple()OO_ABORTOPTION、OO_GETVALUE、OO_PARTITION_ID、OO_INTERPRETEDinsertTuple()OO_ABORTOPTION、OO_SETVALUE、OO_PARTITION_ID、OO_ANYVALUEupdateTuple()OO_ABORTOPTION、OO_SETVALUE、OO_PARTITION_ID、OO_INTERPRETED、OO_ANYVALUEwriteTuple()OO_ABORTOPTION、OO_SETVALUE、OO_PARTITION_ID、OO_ANYVALUEdeleteTuple()OO_ABORTOPTION、OO_GETVALUE、OO_PARTITION_ID、OO_INTERPRETED、OO_ANYVALUE
可选的
sizeOfOptions参数用于保持此接口与先前定义的OperationOptions结构的向后兼容性。如果接口实现检测到异常大小,则可以使用它来确定如何解释传递的OperationOptions结构。要启用此功能,调用方应为此参数的值传递sizeof(NdbOperation::OperationOptions)。如果指定了选项,则还必须指定其长度 (
sizeOfOpts)。
- 返回值
成功返回
0,失败返回-1。
- 描述
获取此扫描的
NdbTransaction对象。- 签名
NdbTransaction* getNdbTransaction ( void ) const- 参数
无.
- 返回值
指向
NdbTransaction对象的指针。
- 描述
此方法用于确定给定的扫描操作是否已修剪到单个分区。对于使用 NdbRecord 定义的扫描,可以在执行扫描之前或之后调用此方法。对于未使用
NdbRecord定义的扫描,getPruned()仅在执行扫描后才有效。- 签名
bool getPruned ( void ) const- 参数
无.
- 返回值
如果扫描被修剪到单个表分区,则返回
true。
- 描述
此方法锁定当前元组。
- 签名
-
可以使用可选的单个参数调用此方法,可以使用以下两种方法之一
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_ABORTOPTION、OO_GETVALUE和OO_ANYVALUE。如果指定了选项,则还必须指定它们的长度(
sizeOfOptions)。
在
NdbRecAttr样式扫描上调用NdbRecord扫描锁接管是无效的,在NdbRecord样式扫描上调用NdbRecAttr样式扫描锁接管也是无效的。 - 返回值
此方法返回指向
NdbOperation对象的指针,或者返回NULL。
- 描述
-
此方法用于获取扫描交易中的下一个元组。每次调用
nextResult()后,NdbOperation::getValue()中定义的缓冲区和NdbRecAttr对象将使用扫描元组中的值进行更新。当在文件末尾执行
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内核以获取更多元组;将fetchAllowed设置为false会阻止这种情况发生。通过将其设置为
false来禁用fetchAllowed会强制NDB处理其缓存中已有的任何记录。当没有更多缓存记录时,它返回2。然后,您必须使用等于true的fetchAllowed调用nextResult(),以便联系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为 true 时)。必须事先使用NdbTransaction::scanTable()(或NdbTransaction::scanIndex())指定定义行格式的NdbRecord对象。如果为 false,
fetchAllowed会强制NDB处理其缓存中已有的任何记录。有关此参数的更多详细信息,请参见上一 参数 小节中的说明。如上一 参数 小节以及 第 1.4.4 节“自适应发送算法” 中所述,将
forceSend设置为true意味着立即发送交易。
- 返回值
-
此方法返回以下 4 个整数值之一,解释如下列表所示
-1:表示发生错误。0:已收到另一个元组。1:没有更多要扫描的元组。2:没有更多缓存记录(调用nextResult(true)以获取更多记录)。
- 示例
- 描述
此方法用于执行扫描。
- 签名
virtual int readTuples ( LockMode mode = LM_Read, Uint32 flags = 0, Uint32 parallel = 0, Uint32 batch = 0 )- 参数
-
此方法采用此处列出的四个参数
-
锁
mode;这是一个LockMode值。使用排他锁进行扫描。 使用排他锁进行扫描时,必须格外小心,因为如果两个线程同时在同一范围内执行此扫描,则很有可能导致死锁。如果扫描也有序(即使用
SF_OrderBy或SF_Descending),则发生死锁的可能性会增加。NdbScanOperation::close()方法也会受到此死锁的影响,因为在实际关闭扫描之前,所有未完成的请求都将得到处理。 一个或多个
ScanFlag值。多个值通过OR进行组合在
parallel中扫描的片段数;使用0要求使用最大可能数量。batch参数指定下一个NdbScanOperation::nextResult(true)方法调用从服务器返回到客户端的记录数。使用0自动指定最大值。
-
- 返回值
成功返回
0,失败返回-1。
- 描述
使用此方法可以在不更改任何
getValue()调用或搜索条件的情况下重新启动扫描。- 签名
int restart ( bool forceSend = false )- 参数
通过将
forceSend设置为true来调用此方法,以强制发送交易。- 返回值
成功返回
0;失败返回-1。
本节提供有关 ScanFlag 数据类型的信息。
- 描述
此类型的取值是与
readTuples()方法一起使用的扫描标志。可以使用多个值,在这种情况下,它们作为该方法的第二个参数通过OR进行组合。有关更多信息,请参见 NdbScanOperation::readTuples()。- 枚举值
-
下表显示了可能的值及其说明
表 2.64 NdbScanOperation::ScanFlag 的值和说明
值 描述 SF_TupScan按 TUP 顺序扫描(即,按内存中行的顺序)。仅适用于表扫描。 SF_DiskScan按磁盘顺序扫描(磁盘上行的顺序)。仅适用于表扫描。 SF_OrderBy有序索引扫描(升序);从索引扫描返回的行已排序,并按索引键排序。按升序或降序进行的扫描都会受此标志的影响,该标志会导致 API 在每个片段的有序扫描之间执行归并排序,以获得单个排序结果集。
注意:
有序索引是分布式的,表的每个片段都有一个有序索引。
范围扫描通常在所有索引片段之间并行进行。有时,可以将它们修剪到一个索引片段。
每个索引片段范围扫描都可以按升序或降序返回结果。默认值为升序;要选择降序,请设置
SF_Descending标志。当并行扫描多个索引片段时,结果将发送回 NDB,在返回给用户之前,可以选择在 NDB 对其进行归并排序。此归并排序使用
SF_OrderBy和SF_OrderByFull标志进行控制。如果未使用
SF_OrderBy或SF_OrderByFull,则每个索引片段的结果都按顺序排列(升序或降序),但来自不同片段的结果可能会交错。-
使用
SF_OrderBy或SF_OrderByFull时,将在内部施加一些额外的约束;这些约束列举如下如果范围扫描未修剪到一个索引片段,则必须并行扫描所有索引片段。(可以使用小于完全并行度的并行度来执行无序扫描。)
在返回任何行之前,必须先获取每个索引片段的结果,以确保正确的归并排序。这会序列化扫描的“滚动”,从而可能导致行吞吐量降低。
在所有索引片段返回任何批处理之前,无序扫描可以将行返回给 API 客户端,并且可以将下一批处理请求与行处理重叠。
SF_OrderByFull这与 SF_OrderBy相同,只是所有键列都会自动添加到读取位掩码中。SF_Descending导致按降序执行有序索引扫描。 SF_ReadRangeNo对于索引扫描,设置此标志后,可以调用 NdbIndexScanOperation::get_range_no()来读回NdbIndexScanOperation::setBound()中定义的range_no。此外,设置此标志后,如果还设置了SF_OrderBy或SF_OrderByFull,则会先返回范围内的所有结果,然后再返回后续范围内的任何结果。SF_MultiRange指示此扫描是多范围扫描的一部分;每个范围都单独扫描。 SF_KeyInfo请求将 KeyInfo发送回调用方。这使得可以使用lockCurrentTuple()接管扫描获取的行锁,方法是确保内核发送回标识行和锁所需的信息。默认情况下,使用LM_Exclusive的扫描会启用此标志,但必须显式指定才能接管LM_Read锁。(有关详细信息,请参阅LockMode文档。)
本节提供有关 ScanOptions 数据结构的信息。
- 父类
- 描述
-
此数据结构用于将选项传递给
NdbRecord的scanTable()和scanIndex()方法(NdbTransaction类)。通过设置optionsPresent字段中的相应位来标记每个选项类型的存在。只有optionsPresent字段中标记的选项类型需要合理的数据。所有数据在操作定义时从
ScanOptions结构(以及任何子结构)中复制出来。如果不需要任何选项,则可以将NULL作为ScanOptions指针传递。 - 成员
-
下表显示了构成此结构的元素
表 2.65 NdbScanOperation::ScanOptions 属性、类型和描述
名称 类型 描述 optionsPresentUint64存在哪些选项。 [...] 类型:SO_SCANFLAGS:0x01SO_PARALLEL:0x02SO_BATCH:0x04SO_GETVALUE:0x08SO_PARTITION_ID:0x10SO_INTERPRETED:0x20SO_CUSTOMDATA:0x40SO_PARTINFO:0x80
选项类型。 scan_flagsUint32控制扫描行为的标志;有关详细信息,请参阅 NdbScanOperation::ScanFlag。 parallelUint32扫描并行度;0(默认值)设置最大并行度。 batchUint32从数据节点到 API 节点的传输批量大小;0(默认值)允许自动选择此值。 extraGetValuesGetValueSpec要为匹配 sdcan 条件的每一行读取的额外值。 numExtraGetValuesUint32要读取的额外值的数量。 partitionIdUint32将扫描限制为具有此 ID 的分区;或者,您可以在此处提供 PartitionSpec。对于索引扫描,可以为每个范围提供分区信息。interpretedCodeNdbInterpretedCode要作为扫描的一部分执行的解释代码。 customDatavoid*与此扫描操作关联的数据指针。 partitionInfoPartitionSpec用于限制此扫描的分区信息。 sizeOfPartInfoUint32边界分区信息的大小。 有关更多信息,请参见 第 2.3.22 节 “NdbRecord 接口”。
- 描述
此方法用于更新当前元组。
- 签名
-
最初,可以使用单个可选参数调用此方法,如下所示
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。