View a markdown version of this page

Aurora DSQL での DDL および分散トランザクション - Amazon Aurora DSQL

Aurora DSQL での DDL および分散トランザクション

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

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

同時実行制御レスポンス

データベースカタログは分散されているため、Aurora DSQL は、カタログバージョンを更新する分散トランザクションとして DDL スキーマの変更を管理します。古いバージョンのカタログのキャッシュされたコピーを持つセッションは、次にストレージとやり取りするときに、SQLSTATE コード 40001 や OCC コード OC001 の同時実行制御レスポンスを受け取ることがあります。

例えば、次の一連のアクションを考えてみましょう。

  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 のトランザクションには 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 の非同期インデックス」を参照してください。