

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

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

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

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

**並行控制錯誤**  
如果執行交易時其他交易正在更新資源，Aurora DSQL 會傳回並行控制違規錯誤。例如，假設發生下列一系列動作：  

1. 在工作階段 1 中，使用者將資料欄新增至資料表 `mytable`。

1. 在工作階段 2 中，使用者嘗試將資料列插入 `mytable`。

   Aurora DSQL 傳回錯誤 `SQL Error [40001]: ERROR: schema has been updated by another transaction, please retry: (OC001).`

**相同交易中的 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)。