メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012年12月1日)

直列化可能分離

一部のアプリケーションでは、クエリとロードを同時に行うだけでなく、複数のテーブルまたは同じテーブルに同時に書き込む能力を必要とします。この文脈では、同時とは、厳密に同じ時間に実行するようにスケジュールするという意味ではなく、重複するという意味です。最初のトランザクションがコミットする前に 2 つ目のトランザクションが開始する場合、2 つのトランザクションは同時であると考えられます。同時操作は、同じユーザーまたは異なるユーザーが制御する異なるセッションから発生する可能性があります。

注記

Amazon Redshift はデフォルトの自動コミット動作がサポートされます。この動作では、個別に実行された SQL コマンドが個別にコミットします。 (BEGIN および END ステートメントにより定義された) トランザクションブロックに一連のコマンドを含めた場合、そのブロックは 1 つのトランザクションとしてコミットされます。そのため、必要に応じてロールバックできます。この動作の例外は TRUNCATE コマンドです。このコマンドは、END ステートメントを必要とせず、現在のトランザクションで行われたすべての未処理変更が自動的にコミットされます。

Amazon Redshift では、同時書き込みオペレーションはテーブルの書き込みロックと直列化分離を利用して安全にサポートされます。直列化分離では、テーブルに対して実行されるトランザクションは、そのテーブルに対して実行される唯一のトランザクションであるという錯覚が守られます。例えば、T1 と T2 という 2 つの同時実行トランザクションで次の少なくとも 1 つとして同じ結果が生成されます。

  • T1 と T2 がこの順序で連続して実行されます

  • T2 と T1 がこの順序で連続して実行されます

同時トランザクションは互いに認識されません。互いの変更を検出できません。各同時トランザクションにより、トランザクションの始めにデータベースのスナップショットが作成されます。データベーススナップショットは、ほとんどの SELECT ステートメント、COPY、DELETE、INSERT、UPDATE、TRUNCATE などの DML コマンド、次の DDL コマンドの最初の発生時にトランザクション内で作成されます。

  • ALTER TABLE (列を追加または削除する)

  • CREATE TABLE

  • DROP TABLE

  • TRUNCATE TABLE

同時トランザクションの任意の直列実行でその同時実行と同じ結果が生成された場合、そのようなトランザクションは「直列化可能」とみなされ、安全に実行できます。そのようなトランザクションの直列実行で同じ結果が生成されない場合、直列化可能性を壊すステートメントを実行するトランザクションが中止となり、ロールバックされます。

システムカタログテーブル (PG) と他の Amazon Redshift システムテーブル (STL と STV) はトランザクションでロックされません。そのため、DDL および TRUNCATE 操作から発生したデータベースオブジェクトに対する変更は同時トランザクションに対するコミットで表示されます。

例えば、T1 と T2 という 2 つの同時トランザクションが開始するとき、テーブル A がデータベースに存在します。PG_TABLES カタログテーブルから選択することで T2 がテーブルの一覧を返し、T1 がテーブル A を削除してコミットし、T2 がテーブルを再度一覧表示する場合、テーブル A は一覧に表示されなくなります。T2 が削除されたテーブルのクエリを試行すると、Amazon Redshift は "関係が存在しない" というエラーを返します。T2 にテーブルの一覧を返す、またはテーブル A が存在することをチェックするカタログクエリは、ユーザーテーブルに対する操作と同じ分離ルールには準拠しません。

これらのテーブルに対する更新のトランザクションはコミット済み読み取り分離モードで実行されます。PG プレフィックスカタログテーブルではスナップショット分離がサポートされません。

システムテーブルとカタログテーブルの直列化分離

データベーススナップショットは、ユーザーが作成したテーブルまたは Amazon Redshift システムテーブル (STL または STV) を参照する SELECT クエリのトランザクションでも作成されます。テーブルを参照しない SELECT クエリは新しいトランザクションのデータベーススナップショットを作成しません。システムカタログテーブル (PG) でだけ実行される INSERT、DELETE、UPDATE ステートメントも同様です。