本節提供關於 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
;呼叫close()
並將此參數設定為true
,以便強制傳送交易。-
releaseOp
也預設為false
;將此設定為true
以釋放操作。每當使用
close()
方法關閉導覽結果集的游標時,無論releaseOp
引數的值為何,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_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
。
- 說明
此方法會鎖定目前的 tuple。
- 簽章
-
可以使用一個選擇性參數呼叫此方法,方法如下所示
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
。
- 說明
-
此方法用於擷取掃描交易中的下一個 tuple。在每次呼叫
nextResult()
之後,NdbOperation::getValue()
中定義的緩衝區和NdbRecAttr
物件會使用掃描 tuple 中的值進行更新。當在檔案結尾後執行
nextResult()
時,NDB
會傳回錯誤碼 4210 (Ndb 傳送的資訊超出指定的長度),並且額外的交易物件會透過將其傳回正確 TC 節點的閒置清單來釋放。 - 簽名
-
可以使用兩種方式之一來調用此方法。第一個如下所示
int nextResult ( bool fetchAllowed = true, bool forceSend = false )
也可以使用此方法,如下所示
int nextResult ( const char*& outRow, bool fetchAllowed = true, bool forceSend = false )
- 參數 (雙參數版本)
-
此方法採用以下兩個參數
-
通常,NDB API 會在必要時聯絡
NDB
核心以取得更多 tuple;將fetchAllowed
設定為false
可防止這種情況發生。透過將
fetchAllowed
設定為false
來停用它,會強制NDB
處理其快取中已有的任何記錄。當沒有更多快取記錄時,它會傳回2
。然後,您必須呼叫fetchAllowed
等於true
的nextResult()
,才能聯絡NDB
以取得更多記錄。當
nextResult(false)
傳回0
時,您應該使用execute(NdbTransaction::NoCommit)
將記錄傳輸到另一個交易。當nextResult(false)
傳回2
時,您通常應該執行並提交其他交易。這會導致任何鎖定傳輸到其他交易、進行更新或刪除,然後釋放鎖定。在此之後,您可以呼叫nextResult(true)
,讓更多記錄擷取並快取到 NDB API 中。注意如果您沒有將記錄傳輸到另一個交易,則當下次聯絡
NDB
核心以取得更多記錄時,將會釋放這些記錄上的鎖定。當您想要更新或刪除給定交易中取得的所有記錄時,停用
fetchAllowed
會很有用,因為這樣做可以節省時間並加快掃描記錄的更新或刪除。 forceSend
預設為false
,通常可以省略。但是,將此參數設定為true
表示交易會立即傳送。如需更多資訊,請參閱第 1.4.4 節「調適性傳送演算法」。
-
- 參數 (三參數版本)
-
也可以使用以下三個參數呼叫此方法
呼叫
nextResult()
會設定指向outRow
中下一列的指標 (如果傳回 0)。此指標僅在下次呼叫fetchAllowed
為 true 的nextResult()
時才有效。定義列格式的NdbRecord
物件必須事先使用NdbTransaction::scanTable()
(或NdbTransaction::scanIndex()
) 指定。當為 false 時,
fetchAllowed
會強制NDB
處理其快取中已有的任何記錄。如需更多詳細資訊,請參閱先前參數小節中此參數的說明。將
forceSend
設定為true
表示交易會立即傳送,如先前參數小節以及第 1.4.4 節「調適性傳送演算法」中所述。
- 傳回值
-
此方法傳回下列 4 個整數值之一,其解譯方式如下列清單所示
-1
:表示發生錯誤。0
:已收到另一個 tuple。1
:沒有更多 tuple 可以掃描。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,然後它們可以選擇性地進行合併排序,再傳回給使用者。此合併排序使用
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 屬性,包含類型和描述
名稱 類型 說明 optionsPresent
Uint64
哪些選項存在。 [...] 類型
: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 節「The NdbRecord Interface」以取得更多資訊。
- 參數(原始)
此方法採用單個選擇性參數—應該執行鎖定的交易。如果省略此參數,則交易為目前的交易。
- 參數 (使用 NdbRecord)
-
當使用
NdbRecord
介面時,此方法會採用下列參數,如下列清單所述接管交易 (
takeOverTrans
)。參考用於掃描的欄的
record
(NdbRecord
物件)。要從中讀取的
row
。如果沒有要讀取的屬性,請將此值設定為NULL
。mask
指標是選擇性的。如果存在,則只會由掃描擷取遮罩中對應位元設定的資料行。
- 傳回值
此方法會傳回
NdbOperation
物件或NULL
。