View a markdown version of this page

Aurora DSQL 的並行控制 - Amazon Aurora DSQL

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Aurora DSQL 的並行控制

並行功能可讓多個工作階段同時存取和修改資料,而不會影響資料完整性和一致性。Aurora DSQL 提供 PostgreSQL 相容性,同時實作現代、無需鎖定的並行控制機制。其可透過快照隔離維持完整的 ACID 合規,以確保資料一致性和可靠性。

Aurora DSQL 的主要優點是無需鎖定架構,可消除常見的資料庫效能瓶頸。Aurora DSQL 可防止緩慢交易封鎖其他操作,並消除死結的風險。這種方法讓 Aurora DSQL 特別適合效能和可擴展性至關重要的高輸送量應用程式。

並行控制回應

Aurora DSQL 使用開放式並行控制 (OCC),其運作方式與傳統的鎖定型系統不同。OCC 會評估遞交時的衝突,而不是使用鎖定。這個遞交時間衝突評估的程序也稱為判斷。當 Aurora DSQL 偵測到衝突時,它會傳回具有 SQLSTATE 程式碼 的 PostgreSQL 序列化失敗40001。回應訊息包含識別衝突類型的 OCC 程式碼:

OC000 — 資料衝突

嘗試修改相同資料列的兩個交易。具有最早遞交時間的交易會成功,而衝突的交易會收到 OC000 回應:

ERROR: change conflicts with another transaction (OC000) (SQLSTATE 40001)
OC001 — 結構描述衝突

工作階段的快取結構描述目錄已過期。當 Aurora DSQL 偵測到自工作階段載入其快取以來目錄版本已變更,且交易無法安全地重新基底至目前版本時,交易會收到 OC001 回應:

ERROR: schema has been updated by another transaction (OC001) (SQLSTATE 40001)

修改結構描述目錄的任何操作都可能導致 OC001 回應,包括 DDL 陳述式,例如 CREATE TABLE和 ALTER TABLE,以及 GRANT和 REVOKE陳述式。如需詳細資訊,請參閱Aurora DSQL 的 DDL 和分散式交易。

設計您的應用程式以實作重試邏輯來處理這些回應。理想設計模式為等冪,並盡可能讓交易重試成為優先求助方法。建議邏輯類似於,標準 PostgreSQL 鎖定逾時或死結情況下的中止和重試邏輯。不過,使用 OCC 時,您的應用程式必須更頻繁地執行此邏輯。

資料衝突類型

由於 Aurora DSQL 並行控制機制, SELECT ... FOR UPDATE和 SELECT ... FOR KEY SHARE子句會在遞交時透過樂觀的衝突偵測產生結果,而不是鎖定。在 Aurora DSQL 中,當一個交易寫入資料列,而另一個使用上述其中一個子句讀取它時,根據交易使用的欄,可能會在遞交時間出現衝突。下列子句決定 Aurora DSQL 如何偵測這些衝突。

金鑰欄定義

索引鍵資料欄是屬於唯一、非部分、非表達式索引的成員的資料欄。所有其他資料欄都是非索引鍵資料欄。

SELECT ... FOR UPDATE

宣告 Aurora DSQL 會將選取的資料列視為交易寫入資料列。如果另一個交易在同一列SELECT ... FOR KEY SHARE上執行 UPDATE、SELECT ... FOR UPDATE、 DELETE或 並先遞交,則執行的交易SELECT ... FOR UPDATE會失敗並顯示 OC000 回應。此子句與資料列的任何並行寫入,以及並行FOR UPDATE或FOR KEY SHARE讀取衝突。

SELECT ... FOR KEY SHARE

宣告交易取決於所選資料列的索引鍵資料欄。如果另一個交易刪除資料列、變更其索引鍵資料欄,或先執行SELECT ... FOR UPDATE和遞交,則執行的交易SELECT ... FOR KEY SHARE會失敗並顯示OC000回應。UPDATE 與非索引鍵資料欄並行不會衝突。

Aurora DSQL 不支援 NO KEY UPDATE或 FOR SHARE子句。不過,DML 會隱含使用 NO KEY UPDATE機制。下列矩陣摘要說明兩個存取相同資料列衝突的並行交易何時發生。X 表示兩個操作衝突:任何交易遞交最後失敗並顯示 OC000 回應。空白儲存格表示兩個交易都可以遞交。

作業 INSERT、DELETE、 UPDATE(索引鍵欄) 或 SELECT ... FOR UPDATE UPDATE (僅限非索引鍵資料欄) SELECT ... FOR KEY SHARE
INSERT、DELETE、 UPDATE(索引鍵欄) 或 SELECT ... FOR UPDATE X X X
UPDATE (僅限非索引鍵資料欄) X X
SELECT ... FOR KEY SHARE X

最佳化交易效能的指導方針

為了最佳化效能,請將單一索引鍵或小型索引鍵範圍上的激烈爭用性降至最低。若要達成此目標,請使用下列指導方針設計結構描述,將更新分散至叢集索引鍵範圍:

  • 為您的資料表選擇隨機主索引鍵。

  • 避免使用會提高單一索引鍵爭用性的模式。即使交易量增加,此方法也能確保最佳效能。