すのふら

すのふら

日々の備忘録

Amazon Redshiftで「Serializable isolation violation on table」のエラーが発生した

バッチ処理中にRedshiftでエラーが発生した。

「Serializable isolation violation on table - [数値], transactions forming the cycle are: [数値], [数値](pid:[数値])」

というメッセージ。

原因は単純で1つのテーブルに対し同時に複数の書き込み処理はできないよってエラー。

Amazon Redshift の同時書き込みオペレーションは、直列化可能でなければなりません。すなわち、トランザクションは、同時に実行された場合と同じ結果を出せる 1 つ以上の順序で、直列的に実行可能でなければなりません。詳細は直列化可能分離をご覧ください。
「ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift」エラーを解決する


Serializable Isolationは直列化可能分離という意味で、開発者ドキュメント上では

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

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

な感じなことが書かれている。


確かに同じテーブルに対して、書き込みをする処理が同時に走っていたのでこのエラーに引っかかっていたのかなーと。