ablog

不器用で落着きのない技術者のメモ

Redshift の "ERROR: 1023 DETAIL: Serializable isolation violation"

準備

  • psql で Redshift に接続する。
psql "host=ds2xl-2n.******.us-west-2.redshift.amazonaws.com user=awsuser dbname=mydb port=5439"
  • テーブルを作成してデータを投入する。
\echo :AUTOCOMMIT;
CREATE TABLE tab1 (col1 INTEGER NOT NULL);
CREATE TABLE tab2 (col1 INTEGER NOT NULL);
CREATE TABLE tab3 (col1 INTEGER NOT NULL);
CREATE TABLE tab4 (col1 INTEGER NOT NULL);
insert into tab1 values (1);
insert into tab2 values (1);
insert into tab3 values (1);
insert into tab4 values (1);

Serializable isolation violation を再現させる

  • セッション1
ds2xl-2n awsuser 18:35:20 =# begin;
BEGIN
Time: 2.073 ms
ds2xl-2n awsuser 18:35:35 =# select * from tab1;
 col1
------
    1
(1 row)

Time: 10.063 ms
ds2xl-2n awsuser 18:35:43 =# insert into tab2 values (1);
INSERT 0 1
Time: 16.216 ms
ds2xl-2n awsuser 18:35:56 =#
  • セッション2
ds2xl-2n awsuser 18:35:28 =# begin;
BEGIN
Time: 2.100 ms
ds2xl-2n awsuser 18:35:36 =# insert into tab1 values (1);
INSERT 0 1
Time: 18.034 ms
ds2xl-2n awsuser 18:35:49 =# select * from tab2;
ERROR:  1023
DETAIL:  Serializable isolation violation on table - 100229, transactions forming the cycle are: 11610, 11611 (pid:19693)
Time: 54.440 ms
ds2xl-2n awsuser 18:36:04 =#

再現しないケース1

psql はデフォルトで auto commit = on のため begin で明示的にトランザクションを開始しない場合は DML を発行する度に commit が発行されるため、"Serializable isolation violation" は発生しない。

  • セッション1
ds2xl-2n awsuser 18:38:49 =# select * from tab1;
 col1
------
    1
(1 row)

Time: 2.011 ms
ds2xl-2n awsuser 18:38:50 =# insert into tab2 values (1);
INSERT 0 1
Time: 358.094 ms
ds2xl-2n awsuser 18:39:07 =#
  • セッション2
ds2xl-2n awsuser 18:38:34 =# insert into tab1 values (1);
INSERT 0 1
Time: 392.567 ms
ds2xl-2n awsuser 18:39:00 =# select * from tab2;
 col1
------
    1
    1
    1
(3 rows)

Time: 8.442 ms
ds2xl-2n awsuser 18:39:12 =#

再現しないケース2

当然、異なるテーブルに対するトランザクションでは発生しない。

  • セッション1
ds2xl-2n awsuser 18:44:32 =# begin;
BEGIN
Time: 1.718 ms
ds2xl-2n awsuser 18:44:35 =# select * from tab1;
 col1
------
    1
    1
(2 rows)

Time: 1527.429 ms
ds2xl-2n awsuser 18:44:42 =# insert into tab2 values (1);
INSERT 0 1
Time: 16.169 ms
ds2xl-2n awsuser 18:44:56 =#
  • セッション2
ds2xl-2n awsuser 18:44:36 =# begin;
BEGIN
Time: 1.375 ms
ds2xl-2n awsuser 18:44:38 =# insert into tab3 values (1);
INSERT 0 1
Time: 15.809 ms
ds2xl-2n awsuser 18:44:49 =# select * from tab4;
 col1
------
    1
(1 row)

Time: 8.116 ms
ds2xl-2n awsuser 18:45:02 =#