Amazon Redshift で発生する、「ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift」というエラーの解決方法を教えてください。

所要時間1分
0

Amazon Redshift の操作を複数のセッションで同時に実行すると、「ERROR: 1023 DETAIL: 「Serializable isolation violation on table in Redshift」 (Redshift のテーブルでシリアライズ可能な分離に関する違反が発生しました) というエラーメッセージが表示されます。

簡単な説明

Amazon Redshift の同時書き込み操作は、トランザクションを何らかの順序に従って実行するために、シリアライズ可能である必要があります。さらに、シリアル実行により、トランザクションが同時に実行された場合と同じ結果が得られる必要があります。詳細については、「シリアライズ可能な分離」を参照してください。

解決策

次のいずれかの方法で、シリアライズ可能な分離に関するエラーを解決します。

非アトミック操作をトランザクションの外に移動する

2 つのトランザクション内の個々の操作が、もう一方のトランザクションの結果に影響を与えるような相互参照を行っている場合は、この方法を使用します。

結果を他の操作と連動させる必要がない場合は、SELECT ステートメントをトランザクションの外に移動してください。

次の例では、SELECT ステートメントをトランザクションの外に移動しています。

Session1_Redshift=# BEGIN;Session1_Redshift = # insert into tab1 values (1)
Session1_Redshift = # END;
Session1_Redshift # select * from tab2;

Session2_Redshift # select * from tab1;Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;

上記のトランザクションはシリアライズ可能です。トランザクションを順番に実行しても、結果は同時に実行したときと同じになります。

各セッションですべてのテーブルをロックしてシリアライズを強制する

LOCK コマンドは、シリアライズ可能な分離に関するエラーを引き起こす可能性のある操作をブロックします。LOCK コマンドを実行する際、次の手順を実行します。

  • トランザクション内の読み取り専用 SELECT ステートメントが影響するテーブルを含め、トランザクションによる影響を受けるすべてのテーブルをロックします。
  • 操作が実行される順序に関係なく、テーブルを同じ順序でロックします。
  • 操作を実行する前に、トランザクションの開始時にすべてのテーブルをロックします。

同時実行トランザクションでスナップショット分離を使用する

シリアライズ可能な分離は厳密なシリアライズを実施します。Amazon Redshift が同時に実行されているトランザクションのシリアル順序に結果をマッピングできない場合、トランザクションが失敗することがあります。

スナップショット分離により同時実行性が向上するため、同じテーブル内の別々の行への同時変更が正常に完了します。

トランザクションは、データベースの最新のコミットバージョン、つまりスナップショットで実行を継続します。

データベースでスナップショット分離を設定し、CREATE DATABASE コマンドまたは ALTER DATABASE コマンドに ISOLATION LEVEL パラメータを含めます。

データベースが使用している同時実行モデルを確認するには、次のクエリ STV_DB_ISOLATION_LEVEL を実行します。

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

データベースの分離レベルを変更する際、次のベストプラクティスを実施してください。

  • データベース分離レベルを変更するには、スーパーユーザーまたは CREATE DATABASE のアクセス許可が必要です。
  • DEV データベース環境の分離レベルは変更できません。
  • トランザクションブロック内の分離レベルは変更できません。
  • 他のユーザーがデータベースに接続している場合、分離レベルの変更コマンドは失敗します。
  • 分離レベルの変更コマンドにより、現在のセッションの分離レベル設定が変更される場合があります。

関連情報

同時書き込み操作を管理する

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ