

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

# Aurora DSQL 的 DDL 和分散式交易
<a name="working-with-ddl"></a>

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

具體來說，Aurora DSQL 的 DDL 行為有下列不同：

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

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

1. 在工作階段 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 不支援下列交易，因為其中包含 `CREATE` 和 `INSERT` 兩種陳述式。  

```
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 的非同步索引](working-with-create-index-async.md)。