簡介
使用唯讀交易或單一讀取呼叫在 Spanner 中讀取資料時,可設定時間戳記範圍,告訴 Spanner 如何選擇時間戳記,在該時間點讀取資料。
為何要設定時間戳記界限?如果資料庫分散各地 (也就是使用多區域執行個體設定建立 Spanner 執行個體),且應用程式容許讀取稍微過時的資料,那麼您就可以享有執行過時讀取在延遲時間上的優點,而不需執行強式讀取。如要進一步瞭解這些讀取類型,請參閱讀取一文。
時間戳記界限類型
時間戳記界限類型如下:
- 強式 (預設值):讀取最新資料。
- 限定的過時程度:讀取不比界限舊的資料版本。
- 精確的過時程度:讀取某個時間戳記時間的資料版本,例如過去的某一個時間點。您也可以指定未來的時間戳記。(如果您指定未來的時間戳記,Spanner 會等到該時間戳記時間才會提供讀取作業。)
注意:
雖然使用這些時間戳記界限模式不是讀寫交易的一部分,但卻可以封鎖等待的並行讀寫入交易,使其無法認可。雖然限定的過時程度讀取作業會試著選出一個時間戳記以避免封鎖,但仍可能會遭到封鎖。
過時讀取 (例如使用受限或精確過時類型) 在最長的過時區間時可獲致最大效能。過時程度最少要 10 秒才能有這項優勢。
Spanner 會追蹤資料庫的
earliest_version_time,指定可讀取資料舊版本的最早時間。您無法讀取早於最早版本時間的時間戳記。
稍後會詳細說明 Spanner 時間戳記界限類型。
同步一致性
Spanner 提供強式讀取界限類型。強式讀取保證在開始讀取之前可以看到所有認可的交易效果。此外,單一讀取作業產生的資料列會彼此一致,若讀取作業的任一部分觀察到交易,則讀取的所有部分都可看見該交易。
強式讀取無法重複:兩筆連續的強式唯讀交易若有並行的寫入作業,可能會傳回不一致的結果。若讀取之間的一致性是必要的,應在相同交易或精準的讀取時間戳記執行讀取作業。
限定的過時程度
Spanner 提供限定的過時程度界限類型。限定的過時程度模式可讓 Spanner 根據使用者提供的過時界限,挑選讀取時間戳記。Spanner 會在過時界限內選擇最新的時間戳記,以在最近可用的備用資源執行讀取,不會遭到封鎖。
產生的所有資料列都會與彼此一致。若讀取的任一部分觀察到交易,讀取的所有部分都可看見該交易。限定的過時程度讀取作業不可重複:兩個過時的讀取即使使用相同的過時界限,也可以在不同的時間戳記執行,並且傳回不一致的結果。
限定的過時程度讀取作業通常會比精確的過時程度讀取作業慢一點。
精確的過時程度
Spanner 提供精確的過時程度界限類型。這些時間戳記界限會在使用者指定的時間戳記執行讀取。時間戳記的讀取作業保證會看到全域交易記錄的一致前置字元:這些作業會觀察所有修訂時間戳記小於或等於讀取時間戳記的交易進行的修改,但不會觀察修訂時間戳記較大的交易進行的修改。系統也會封鎖這些讀取,直到所有認可時間戳記少於或等於讀取時間戳記的衝突交易完成。
此時間戳記可以描述為絕對的 Spanner 認可時間戳記或相對於目前時間的過時程度。
這些模式不需要經過「交涉階段」來挑選時間戳記,因此這些模式的執行速度比同等的限定的過時程度並行模式稍快一些。另一方面,限定的過時程度讀取作業通常會傳回較新的結果。
最大時間戳記的過時程度
Spanner 會在背景中持續對已刪除或已覆寫的資料進行垃圾收集,以取回儲存空間。這個程序就是所謂的版本 GC。版本 GC 會在版本超過資料庫的 version_retention_period 期限後取回這些版本。預設期限為 1 小時,但最長可設為 1 週。此限制也適用於時間戳記在執行時已經太舊的進行中讀取和/或 SQL 查詢。讀取時間戳記太舊的讀取和 SQL 查詢會失敗,錯誤為 FAILED_PRECONDITION。唯一例外是使用分區權杖的分區讀取/查詢,這類作業可防止系統在工作階段保持運作時,對過期資料執行垃圾收集作業。