ablog

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

Redshift の Snapshot Isolation の挙動

Delete + Insertをトランザクション(begin/end)で囲んで実行中に他セッションからの Insert はブロックされ(待たされ)る。

  • Delete + Insertするセッション
% psql -a "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=sampledb port=5439"
Password for user awsuser: 
\set PROMPT1 '%[%033[1;32m%]%n %`date +%H:%M` %R%#%[%033[0m%] '
\set PROMPT2 '%[%033[1;32m%]%R%#%[%033[0m%] '
\timing on
Timing is on.
\set HISTSIZE 1000000
psql (14.3, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

awsuser 07:48 =# \x
Expanded display is on.
awsuser 07:48 =# select * from STV_DB_ISOLATION_LEVEL where db_name = 'sampledb';
-[ RECORD 1 ]---+---------------------------------------------------------------------------------------------------------------------------------
db_name | sampledb 
isolation_level | Snapshot Isolation 

Time: 222.836 ms
awsuser 07:48 =# create table if not exists cities_ser(cityid integer not null, city varchar(10) not null, state char(10) not null);
CREATE TABLE
Time: 626.279 ms
awsuser 07:49 =# insert into cities_ser values (1, 'Nagoya', 'Aichi');
INSERT 0 1
Time: 679.750 ms
awsuser 07:49 =# insert into cities_ser values (2, 'Hakata', 'Fukuoka');
INSERT 0 1
Time: 984.175 ms
awsuser 07:49 =# select * from cities_ser;
-[ RECORD 1 ]------
cityid | 1
city | Nagoya
state | Aichi 
-[ RECORD 2 ]------
cityid | 2
city | Hakata
state | Fukuoka 

Time: 25.928 ms
awsuser 07:49 =# begin;
BEGIN
Time: 13.240 ms
awsuser 07:49 =# delete from cities_ser where cityid in (1 ,2);
DELETE 2
Time: 48.685 ms
awsuser 07:50 =# insert into cities_ser values (1, 'Nagoya', 'Aichi2');
INSERT 0 1
Time: 28.497 ms
awsuser 07:51 =# insert into cities_ser values (2, 'Hakata', 'Fukuoka2');
INSERT 0 1
Time: 30.318 ms
awsuser 07:51 =# end;
COMMIT
Time: 640.922 ms
awsuser 07:51 =# 
  • 別セッションから Insert する
% psql -a "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com (http://redshift-cluster-poc-central.ceyg6jv96hfq.ap-northeast-1.redshift.amazonaws.com/) user=awsuser dbname=sampledb port=5439"

Password for user awsuser: 
\set PROMPT1 '%[%033[1;32m%]%n %`date +%H:%M` %R%#%[%033[0m%] '
\set PROMPT2 '%[%033[1;32m%]%R%#%[%033[0m%] '
\timing on
Timing is on.
\set HISTSIZE 1000000
psql (14.3, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

awsuser 07:50 =# select * from cities_ser;
 cityid | city | state 
--------+--------+------------
 1 | Nagoya | Aichi 
 2 | Hakata | Fukuoka 
(2 rows)

Time: 31.174 ms
awsuser 07:50 =# insert into cities_ser values (3, 'Wakayama', 'Wakayama');
INSERT 0 1
Time: 20389.333 ms (00:20.389) ★ ← end でトランザクションが終了するまで待たされる
awsuser 07:51 =# select * from cities_ser;
 cityid | city | state 
--------+----------+------------
 1 | Nagoya | Aichi2 
 2 | Hakata | Fukuoka2 
 3 | Wakayama | Wakayama 
(3 rows)

Time: 26.491 ms
awsuser 07:51 =#