

# Aurora DSQL での DDL および分散トランザクション
<a name="working-with-ddl"></a>

データ定義言語 (DDL) の動作は、Aurora DSQL では PostgreSQL とは異なります。Aurora DSQL は、マルチテナントのコンピューティングおよびストレージフリート上に構築されたマルチ AZ 分散型およびシェアードナッシングのデータベースレイヤーを特徴としています。単一のプライマリデータベースノードまたはリーダーが存在しないため、データベースカタログは分散されます。したがって、Aurora DSQL は、DDL スキーマの変更を分散トランザクションとして管理します。

具体的には、DDL の動作は Aurora DSQL では次のように異なります。

**同時実行制御エラー**  
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 のトランザクションには 1 つの 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 では、`CREATE INDEX` などの DDL オペレーションが影響を受けるテーブルをロックすると、他のセッションからの読み取りと書き込みができなくなります。Aurora DSQL では、これらの DDL ステートメントはバックグラウンドマネージャーを使用して非同期的に実行されます。影響を受けるテーブルへのアクセスはブロックされません。したがって、大きなテーブルの DDL はダウンタイムやパフォーマンスインパクトを与えることなく実行できます。Aurora DSQL の非同期ジョブマネージャーの詳細については、「[Aurora DSQL の非同期インデックス](working-with-create-index-async.md)」を参照してください。