本节提供有关
NdbScanOperation
该类的信息。
- 家长班
- 儿童班
- 描述
该类
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 节“使用扫描更新或删除行”。
- 描述
-
调用此方法关闭扫描。使用此方法关闭扫描后,此扫描返回的行将不再可用。
请参阅 使用独占锁扫描,了解有关多个线程尝试使用独占锁执行相同扫描的信息,以及这如何影响关闭扫描。
- 签名
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
。
- 返回值
没有。
- 描述
该方法用于删除当前元组。
- 签名
-
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
失败。
- 描述
获取
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
必须指定它们的长度 ( )。
在 -style 扫描上调用
NdbRecord
扫描锁接管NdbRecAttr
是无效的,在NdbRecAttr
-style 扫描上调用 -style 扫描锁接管 也是无效的NdbRecord
。 - 返回值
此方法返回指向
NdbOperation
对象的指针,或NULL
.
- 描述
-
此方法用于获取扫描事务中的下一个元组。在每次调用 之后
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
会在必要时联系内核以获取更多元组;设置fetchAllowed
以false
防止这种情况发生。fetchAllowed
通过将其设置为false
强制NDB
处理其缓存中已有的任何记录来 禁用。当没有更多的缓存记录时,它返回2
。然后,您必须nextResult()
使用fetchAllowed
equal 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
处理其缓存中已有的任何记录。有关更多详细信息,请参阅前面的 参数小节中对此参数的描述。设置
forceSend
为true
表示立即发送事务,如前面的 参数小节以及第 1.4.4 节“自适应发送算法”中所述。
- 返回值
-
此方法返回以下 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
orSF_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.63 NdbScanOperation::ScanFlag 值和描述
价值 描述 SF_TupScan
按 TUP 顺序扫描(即按内存中行的顺序)。仅适用于表扫描。 SF_DiskScan
按磁盘顺序扫描(磁盘上的行顺序)。仅适用于表扫描。 SF_OrderBy
有序索引扫描(升序);从索引扫描返回的行已排序,并按索引键排序。升序或降序扫描受此标志影响,这会导致 API 在每个片段的有序扫描中执行合并排序以获得单个排序结果集。
注意事项:
有序索引是分布式的,一个表的每个片段都有一个有序索引。
范围扫描通常在所有索引片段中是并行的。有时,它们可以被修剪为一个索引片段。
每个索引片段范围扫描都可以按升序或降序返回结果。升序是默认值;要选择降序,请设置
SF_Descending
标志。当并行扫描多个索引片段时,结果将发送回 NDB,在返回给用户之前,可以选择对它们进行合并排序。此合并排序是使用
SF_OrderBy
和SF_OrderByFull
标志控制的。如果不使用
SF_OrderBy
orSF_OrderByFull
,则每个索引片段的结果按顺序排列(升序或降序),但不同片段的结果可能会交错。-
使用
SF_OrderBy
or 时SF_OrderByFull
,会在内部施加一些额外的约束;这些列在这里:如果范围扫描未被修剪为一个索引片段,则必须并行扫描所有索引片段。(可以在低于完全并行度的情况下执行无序扫描。)
每个索引片段的结果在返回任何行之前必须可用,以确保正确的合并排序。这序列化了扫描的“滚动”,可能导致较低的行吞吐量。
无序扫描可以在所有索引片段返回任何批次之前将行返回给 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
文档。)
本节提供有关
ScanOptions
数据结构的信息。
- 家长班
- 描述
-
此数据结构用于将选项传递给类的
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 接口”。
- 描述
此方法用于更新当前元组。
- 签名
-
本来,这个方法可以用一个调用。可选参数,采用此处显示的任一方式:
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
。