同時書き込みの例 - Amazon Redshift

同時書き込みの例

次の疑似コードの例は、同時に実行されたときに、トランザクションが進行または待機する仕組みを示しています。

同じテーブルへの同時 COPY 操作

トランザクション 1 は LISTING テーブルに行をコピーします:

begin; copy listing from ...; end;

トランザクション 2 は別のセッションで同時に開始され、さらに多くの行を LISTING テーブルにコピーしようとします。トランザクション 2 は、トランザクション 1 が LISTING テーブルの書き込みロックを解除するまで待機する必要があります。その後、続行できます。

begin; [waits] copy listing from ; end;

片方または両方のトランザクションに COPY コマンドの代わりに INSERT コマンドが含まれる場合、同じ動作が起こることがあります。

同じテーブルへの同時 DELETE 操作

トランザクション 1 がテーブルから行を削除します:

begin; delete from listing where ...; end;

トランザクション 2 が同時に開始され、同じテーブルから行を削除しようとします。行の削除を試行する前にトランザクション 1 の完了を待つため、トランザクション 2 は成功します。

begin [waits] delete from listing where ; end;

片方または両方のトランザクションに DELETE コマンドの代わりに同じテーブルへの UPDATE コマンドが含まれる場合、同じ動作が起こることがあります。

読み取り操作と書き込み操作がミックスされた同時トランザクション

この例では、まずトランザクション 1 は USERS テーブルから行を削除し、テーブルを再ロードします。次に COUNT(*) クエリを実行し、ANALYZE を実行してからコミットします。

begin; delete one row from USERS table; copy ; select count(*) from users; analyze ; end;

その間、トランザクション 2 が開始します。このトランザクションは USERS テーブルへの追加行のコピー、テーブルの分析、最初のトランザクションと同じ COUNT(*) クエリの実行を試行します。

begin; [waits] copy users from ...; select count(*) from users; analyze; end;

2 つ目のトランザクションは最初のトランザクションの完了を待つため、成功します。その COUNT クエリはそれが完了したロードに基づいてカウントを返します。