Docker上のPostgresqlでphantom Readを再現できない
Q&A
Closed
解決したいこと
postgreSQLでファントムリードを再現してます。
が、再現できません。
ご教示いただけますと幸いです
以下詳細です。
発生している問題
別のトランザクションのコミットされた挿入結果と更新結果も見えてしまう。更新結果が見えることは期待していない。
実際の結果
# tx2.sqlの11行目のSELECT分実行結果
id | value
----+-------
2 | 8
1 | 10
3 | 12
(3 rows)
期待する結果
# tx2.sqlの11行目
# tx2.sqlの11行目のSELECT分実行結果
id | value
----+-------
2 | 8
1 | 5
3 | 12
(3 rows)
該当するソースコード
-- docker-compose exec -it postgresql psql -U docker -f src/postgresql/transaction/ch103phantomRead/tx1.sql -d docker
DROP TABLE IF EXISTS tbl CASCADE;
CREATE TABLE tbl(id int,value int);
GRANT ALL ON tbl TO tx2;
INSERT INTO tbl VALUES(1,5),(2,8);
SELECT * FROM tbl;
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
SHOW transaction_isolation;
SELECT pg_sleep(4); -- tx2.sql の最初のSELECTを待つ
UPDATE tbl SET value=10 WHERE id=1;
SELECT pg_sleep(4); -- tx2.sql の2回目のSELECTを待つ
INSERT INTO tbl VALUES(3,12);
COMMIT;
SELECT * FROM tbl;
SELECT pg_sleep(4);
-- docker-compose exec -it postgresql psql -U tx2 -f src/postgresql/transaction/ch103phantomRead/tx2.sql -d docker
SELECT pg_sleep(2); -- tx1.sql のトランザクション開始を待つ
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SHOW transaction_isolation;
SELECT pg_sleep(4); -- tx1.sql の更新を待つ
SELECT * FROM tbl;
SELECT pg_sleep(4); -- tx1.sql の挿入を待つ
SELECT * FROM tbl; -- ここでファントムリードが発生
COMMIT;
実行したときの様子
github リポジトリ
参考
OSS教科書 OSS-DB Silver Ver.3.0対応
10-3-1 トランザクションの分離レベル