PostgreSQL トランザクション分離レベル
v9.6 2017/5
Repeatable Read (反復読み取り)
※ 同一トランザクション内で同じ結果が返る。
→同一トランザクション中は他トランザクションの影響を受けない。
Repeatable Read (反復読み取り)
※ 同一トランザクション内で同じ結果が返る。
Transaction 1
testdb=# BEGIN;
BEGIN
testdb=# SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
1 | A
2 | B
3 | C
(3 行)
/* 左右同じ結果が返る。 */
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
1 | A
2 | B
3 | C
(3 行)
/* 右のコミット前のアップデートは左に反映されない。 */
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
1 | A
2 | B
3 | C
(3 行)
/* 右でコミットしてもアップデートは左に反映されない。 */
testdb=# COMMIT;
COMMIT
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
2 | B
3 | C
1 | D
(3 行)
/* 左でコミットすると右のアップデートが反映される。 */
testdb=# COMMIT;
COMMIT
Transaction 2
※ 自トランザクションをCOMMITあるいはROLLBACKするまで他のトランザクションのCOMMITした結果を見られない。
testdb=# BEGIN;
BEGIN
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
1 | A
2 | B
3 | C
(3 行)
testdb=# UPDATE test_table_2 SET col2='D' WHERE col1= 1;
UPDATE 1
testdb=# SELECT * FROM test_table_2;
col1 | col2
------+------
2 | B
3 | C
1 | D
(3 行)
testdb=# COMMIT;
COMMIT
→同一トランザクション中は他トランザクションの影響を受けない。