Cloud Datastore 查詢中的資料一致性

資料一致性等級

Cloud Datastore 查詢可以提供兩種一致性等級的結果:

  • 同步一致性查詢可保證獲得最新的結果,但可能要花較長的時間才能完成。
  • 最終一致性查詢通常執行速度較快,但可能偶爾會傳回過時的結果。

在最終一致性查詢中,用於收集結果的索引也是透過最終一致性的方式來存取。因此,這類的查詢有時可能會傳回不再符合原始查詢條件的實體,而同步一致性查詢則始終保持交易一致性。如要進一步瞭解實體和索引的更新方式,請參閱 App Engine 中的交易隔離

Cloud Datastore 查詢資料一致性

根據查詢的性質,查詢會傳回一致性保證等級不同的結果:

  • 根據預設,祖系查詢 (在實體群組內) 會維持同步一致性,但可以藉由設定 Cloud Datastore 讀取政策 (請見下文) 改為維持最終一致性。
  • 非祖系查詢始終會維持最終一致性。

按金鑰擷取實體 (也稱為「按金鑰查詢」) 會維持同步一致性。

設定 Cloud Datastore 讀取政策

為了改善效能,您可以設定 Cloud Datastore 的「讀取政策」,如此一來所有的讀取和查詢都會具有最終一致性 (您也可以透過 API 明確設定同步一致性政策,但是這樣的設定並無實質效果,因為無論政策為何,非祖系查詢一律會採取最終一致性。)

您也可以設定 Cloud Datastore 的「呼叫期限」,即為應用程式等待 Cloud Datastore 傳回結果的時間上限 (以秒為單位),超過此期限就會因為錯誤而取消。預設值為 60 秒,目前無法設為高於此上限,但可往下調整以確保特定作業快速失敗 (例如更快速傳回回應給使用者)。

如需在 Java 中設定 Cloud Datastore 讀取政策,您可建構 Datastore 服務設定 (DatastoreServiceConfig) (使用巢狀輔助類別 DatastoreServiceConfig.Builder),並將此設定傳送給 ReadPolicy 類別的執行個體。以下範例顯示如何設定讀取政策、呼叫期限或同時設定兩者:

Java 8

double deadline = 5.0;

// Construct a read policy for eventual consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.EVENTUAL);

// Set the read policy
DatastoreServiceConfig eventuallyConsistentConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy);

// Set the call deadline
DatastoreServiceConfig deadlineConfig = DatastoreServiceConfig.Builder.withDeadline(deadline);

// Set both the read policy and the call deadline
DatastoreServiceConfig datastoreConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy).deadline(deadline);

// Get Datastore service with the given configuration
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(datastoreConfig);

Java 7

double deadline = 5.0;

// Construct a read policy for eventual consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.EVENTUAL);

// Set the read policy
DatastoreServiceConfig eventuallyConsistentConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy);

// Set the call deadline
DatastoreServiceConfig deadlineConfig = DatastoreServiceConfig.Builder.withDeadline(deadline);

// Set both the read policy and the call deadline
DatastoreServiceConfig datastoreConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy).deadline(deadline);

// Get Datastore service with the given configuration
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(datastoreConfig);

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 適用的 App Engine 標準環境