準備
- 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 =#