文件首頁
MySQL NDB Cluster API 開發者指南
相關文件 下載本手冊
PDF (美式 Letter) - 3.6Mb
PDF (A4) - 3.6Mb


2.3.24 NdbScanOperation 類別

本節提供關於 NdbScanOperation 類別的資訊。

NdbScanOperation 類別概觀

父類別

NdbOperation

子類別

NdbIndexScanOperation

說明

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 節「使用掃描來更新或刪除資料列」

NdbScanOperation::close()

說明

呼叫此方法會關閉掃描。使用此方法關閉掃描後,此掃描傳回的資料列將不再可用。

請參閱 具有獨佔鎖定的掃描,以取得關於多個執行緒嘗試使用獨佔鎖定執行相同掃描的資訊,以及這如何影響關閉掃描。

簽章
void close
    (
      bool forceSend = false,
      bool releaseOp = false
    )
參數

此方法採用此處列出的兩個參數

  • forceSend 預設為 false;呼叫 close() 並將此參數設定為 true,以便強制傳送交易。

  • releaseOp 也預設為 false;將此設定為 true 以釋放操作。

    每當使用 close() 方法關閉導覽結果集的游標時,無論 releaseOp 引數的值為何,NdbScanOperation 配置用於接收掃描資料列的緩衝區都會釋放。

傳回值

.

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.63 NdbRecord OperationOptions 的操作類型

    操作類型 (方法) 支援的 OperationOptions 旗標
    readTuple() OO_ABORTOPTIONOO_GETVALUEOO_PARTITION_IDOO_INTERPRETED
    insertTuple() OO_ABORTOPTIONOO_SETVALUEOO_PARTITION_IDOO_ANYVALUE
    updateTuple() OO_ABORTOPTIONOO_SETVALUEOO_PARTITION_IDOO_INTERPRETEDOO_ANYVALUE
    writeTuple() OO_ABORTOPTIONOO_SETVALUEOO_PARTITION_IDOO_ANYVALUE
    deleteTuple() OO_ABORTOPTIONOO_GETVALUEOO_PARTITION_IDOO_INTERPRETEDOO_ANYVALUE

  • 選擇性的 sizeOfOptions 參數用於保持此介面與先前 OperationOptions 結構定義的向後相容性。如果介面實作偵測到異常大小,它可以使用此參數來決定如何解釋傳遞的 OperationOptions 結構。為了啟用此功能,呼叫者應傳遞 sizeof(NdbOperation::OperationOptions) 作為此引數的值。

  • 如果指定了選項,則還必須指定其長度 (sizeOfOpts)。

傳回值

成功時傳回 0,失敗時傳回 -1

NdbScanOperation::getNdbTransaction()

說明

取得此掃描的 NdbTransaction 物件。

簽章
NdbTransaction* getNdbTransaction
    (
      void
    ) const
參數

.

傳回值

指向 NdbTransaction 物件的指標。

NdbScanOperation::getPruned()

說明

此方法用於判斷給定的掃描操作是否已修剪到單個分割區。對於使用 NdbRecord 定義的掃描,可以在執行掃描之前或之後呼叫此方法。對於未使用 NdbRecord 定義的掃描,getPruned() 僅在執行掃描後才有效。

簽章
bool getPruned
    (
      void
    ) const
參數

.

傳回值

如果掃描被修剪到單個表格分割區,則傳回 true

NdbScanOperation::lockCurrentTuple()

說明

此方法會鎖定目前的 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_ABORTOPTIONOO_GETVALUEOO_ANYVALUE

  • 如果指定了選項,則還必須指定其長度 (sizeOfOptions)。

NdbRecAttr 樣式的掃描上呼叫 NdbRecord 掃描鎖定接管無效,在 NdbRecord 樣式的掃描上呼叫 NdbRecAttr 樣式的掃描鎖定接管也無效。

傳回值

此方法傳回指向 NdbOperation 物件的指標,或 NULL

NdbScanOperation::nextResult()

說明

此方法用於擷取掃描交易中的下一個 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 等於 truenextResult(),才能聯絡 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) 以擷取更多記錄)。

範例

請參閱第 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_OrderBySF_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.64 NdbScanOperation::ScanFlag 值和說明

說明
SF_TupScan 以 TUP 順序掃描(即,以記憶體中資料列的順序)。僅適用於資料表掃描。
SF_DiskScan 以磁碟順序掃描(資料列在磁碟上的順序)。僅適用於資料表掃描。
SF_OrderBy

排序索引掃描(遞增);從索引掃描傳回的資料列會排序,並以索引鍵排序。遞增或遞減順序的掃描都會受到此旗標的影響,此旗標會導致 API 在每個片段的排序掃描之間執行合併排序,以取得單一排序結果集。

注意事項:

  • 排序索引是分散式的,每個資料表的片段都有一個排序索引。

  • 範圍掃描通常會在所有索引片段中平行執行。偶爾,它們可以修剪為一個索引片段。

  • 每個索引片段範圍掃描都可以傳回遞增或遞減順序的結果。預設為遞增;若要選擇遞減順序,請設定 SF_Descending 旗標。

  • 當平行掃描多個索引片段時,結果會傳回給 NDB,然後它們可以選擇性地進行合併排序,再傳回給使用者。此合併排序使用 SF_OrderBySF_OrderByFull 旗標控制。

  • 如果未使用 SF_OrderBySF_OrderByFull,則每個索引片段的結果都會依序排列(遞增或遞減),但來自不同片段的結果可能會交錯。

  • 當使用 SF_OrderBySF_OrderByFull 時,內部會強制執行一些額外限制;這些限制在此處列出

    1. 如果範圍掃描未修剪為一個索引片段,則必須平行掃描所有索引片段。(未排序的掃描可以使用低於完全平行的程度執行。)

    2. 在傳回任何資料列之前,必須先取得每個索引片段的結果,以確保正確的合併排序。這會序列化掃描的「捲動」,可能會導致較低的資料列輸送量。

    3. 未排序的掃描可以在所有索引片段傳回任何批次之前,將資料列傳回給 API 用戶端,並且可以將下一個批次的請求與資料列處理重疊。

SF_OrderByFull 這與 SF_OrderBy 相同,唯一的差別是所有索引鍵欄都會自動新增到讀取位元遮罩中。
SF_Descending 導致以遞減順序執行排序索引掃描。
SF_ReadRangeNo 對於索引掃描,當設定此旗標時,可以呼叫 NdbIndexScanOperation::get_range_no() 以讀回在 NdbIndexScanOperation::setBound() 中定義的 range_no。此外,當設定此旗標,並且也設定了 SF_OrderBySF_OrderByFull 時,會先傳回範圍的完整結果,然後再傳回後續範圍的結果。
SF_MultiRange 表示此掃描是多範圍掃描的一部分;每個範圍都會分別掃描。
SF_KeyInfo 要求將 KeyInfo 傳回給呼叫者。這使得可以使用 lockCurrentTuple() 接管掃描取得的資料列鎖定,方法是確保核心傳回識別資料列和鎖定所需的資訊。預設會為使用 LM_Exclusive 的掃描啟用此旗標,但必須明確指定以啟用接管 LM_Read 鎖定。(請參閱 LockMode 文件以取得更多資訊。)

NdbScanOperation::ScanOptions

本節提供關於 ScanOptions 資料結構的資訊。

父類別

NdbScanOperation

說明

此資料結構用於將選項傳遞給 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 介面」

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 節「The NdbRecord Interface」以取得更多資訊。

參數(原始)

此方法採用單個選擇性參數—應該執行鎖定的交易。如果省略此參數,則交易為目前的交易。

參數 (使用 NdbRecord)

當使用 NdbRecord 介面時,此方法會採用下列參數,如下列清單所述

  • 接管交易 (takeOverTrans)。

  • 參考用於掃描的欄的 record (NdbRecord 物件)。

  • 要從中讀取的 row。如果沒有要讀取的屬性,請將此值設定為 NULL

  • mask 指標是選擇性的。如果存在,則只會由掃描擷取遮罩中對應位元設定的資料行。

傳回值

此方法會傳回 NdbOperation 物件或 NULL