本節提供關於 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_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。
- 說明
此方法會鎖定目前的 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 屬性,包含類型和描述
名稱 類型 說明 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 節「The NdbRecord Interface」以取得更多資訊。
- 參數(原始)
此方法採用單個選擇性參數—應該執行鎖定的交易。如果省略此參數,則交易為目前的交易。
- 參數 (使用 NdbRecord)
-
當使用
NdbRecord介面時,此方法會採用下列參數,如下列清單所述接管交易 (
takeOverTrans)。參考用於掃描的欄的
record(NdbRecord物件)。要從中讀取的
row。如果沒有要讀取的屬性,請將此值設定為NULL。mask指標是選擇性的。如果存在,則只會由掃描擷取遮罩中對應位元設定的資料行。
- 傳回值
此方法會傳回
NdbOperation物件或NULL。