本頁說明如何在 Spanner 中使用可重複讀取隔離。
可重複讀取是一種隔離層級,可確保交易中的所有讀取作業,都會看到交易開始時資料庫的一致快照。在 Spanner 中,這項隔離等級是透過一種技術實作,這種技術也常稱為快照隔離。在讀寫並行程度高的情況下,許多交易會讀取其他交易可能修改的資料,因此這個方法很有幫助。使用固定快照時,可重複讀取會避免更嚴格的可序列化隔離層級對效能造成影響。讀取作業可執行,不必取得鎖定,也不會封鎖並行的寫入作業,因此因序列化衝突而可能需要重試的交易較少。詳情請參閱隔離等級總覽。
設定隔離等級
您可以使用下列方法,在資料庫用戶端層級或交易層級,設定讀寫交易的隔離等級:
用戶端程式庫
Go
Java
Node.js
Python
REST
您可以使用 TransactionOptions.isolation_level REST API,在交易層級設定讀寫和唯讀交易的隔離等級。有效選項為 TransactionOptions.SERIALIZABLE 和 TransactionOptions.REPEATABLE_READ。根據預設,Spanner 會將隔離等級設為可序列化隔離。
限制
可重複讀取隔離層級的測試版有下列限制。
- 如果結構定義有檢查限制,可能會發生問題。
- 目前已知問題會導致系統無法驗證檢查限制,因此交易提交時可能會違反限制。因此,如果您的結構定義有檢查限制,我們不建議在預覽版中使用可重複讀取隔離。
- 如果交易執行期間,資料庫發生並行結構定義變更,您可能會遇到問題。
- 如果 DML 陳述式使用
last_statement選項,且 DML 陳述式執行時發生並行結構定義變更,系統可能會在內部重試,並傳回錯誤,指出在設定last_statement選項後,DML 重試作業不正確。套用結構定義變更後重試交易,即可解決這個問題。 - 如果交易中的要求發生
DEADLINE_EXCEEDED錯誤,請在架構變更套用至用戶端後重試交易,以解決問題。
- 如果 DML 陳述式使用
不支援的用途
- 您無法在分區 DML 交易中設定可重複讀取隔離。
- 所有唯讀交易都已在固定快照中運作,不需要鎖定作業,因此在這類交易中設定可重複讀取隔離等級,不會改變任何行為。
- 您無法使用 Spanner 用戶端程式庫,在唯讀、單次使用和分割區作業中設定可重複讀取隔離層級。Spanner 用戶端程式庫不會提供在唯讀、單次使用和分割區查詢作業中設定可重複讀取隔離層級的選項。
後續步驟
進一步瞭解隔離層級。
如要進一步瞭解 Spanner 可序列化和外部一致性,請參閱「TrueTime 與外部一致性」。