View a markdown version of this page

Aurora DSQL 的 DDL 和分散式交易 - Amazon Aurora DSQL

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

Aurora DSQL 的 DDL 和分散式交易

Aurora DSQL 的資料定義語言 (DDL) 行為與 PostgreSQL 不同。Aurora DSQL 具有多可用區域的分散式、不共用物件資料庫層,其建置在多租用戶運算和儲存機群之上。由於不存在單一主要資料庫節點或領導節點,因此資料庫目錄為分散式。亦即,Aurora DSQL 會以分散式交易方式管理 DDL 結構描述變更。

具體來說,Aurora DSQL 的 DDL 行為有下列不同:

並行控制回應

由於資料庫目錄是分散式的,Aurora DSQL 會將 DDL 結構描述變更管理為更新目錄版本的分散式交易。在較早版本中具有目錄快取副本的工作階段,可能會在下一次與儲存體互動OC001時收到具有 SQLSTATE 程式碼40001和 OCC 程式碼的並行控制回應。

例如,假設發生下列一系列動作:

  1. 在工作階段 1 中,使用者將資料欄新增至資料表 mytable。這會更新目錄版本。

  2. 在工作階段 2 中,使用者嘗試將資料列插入 mytable。此工作階段仍會快取先前的目錄版本。

    Aurora DSQL 會傳回 SQL Error [40001]: ERROR: schema has been updated by another transaction (OC001)

注意

當結構描述變更在受影響的交易開始之前已完成時,也可能發生 OC001 回應。Aurora DSQL 查詢處理器會在查詢執行期間以反應方式探索目錄變更,因此閒置的工作階段仍可能使用過時的目錄版本運作。重試時,工作階段會重新整理其目錄快取,交易通常會成功。

相同交易中的 DDL 和 DML

Aurora DSQL 的交易只能包含一個 DDL 陳述式,且不能同時包含 DDL 和 DML 陳述式。此限制表示您無法建立資料表,並將資料插入相同交易的相同資料表中。例如,Aurora DSQL 支援以下序列交易。

BEGIN; CREATE TABLE mytable (ID_col integer); COMMIT; BEGIN; INSERT into FOO VALUES (1); COMMIT;

Aurora DSQL 不支援下列交易,因為其中包含 CREATEINSERT 兩種陳述式。

BEGIN; CREATE TABLE FOO (ID_col integer); INSERT into FOO VALUES (1); COMMIT;
非同步 DDL

在標準 PostgreSQL 中,DDL 操作 (例如 CREATE INDEX 鎖定受影響的資料表) 會導致其他工作階段無法讀取和寫入。在 Aurora DSQL 中,這些 DDL 陳述式會使用背景管理員以非同步方式執行。因此不會封鎖存取受影響的資料表。也就是說,大型資料表上的 DDL 可在不造成停機或影響效能的情況下執行。如需 Aurora DSQL 非同步作業管理員的詳細資訊,請參閱 Aurora DSQL 的非同步索引