postgresql: set transaction snapshot

2345 ワード

使い方SET TRANSACTION SNAPSHOT snapshot_id
既存のトランザクションのsnapshotは、新しいトランザクションで使用できます.このsnapshotは、まずexport(pg_export_snapshot)を行う必要があります.SET TRANSACTION SNAPSHOTは、新しいトランザクションで実行する必要があります.トランザクション独立性レベルは、SERIALIZABLE or REPEATABLE READである必要があります.新しいトランザクション独立性レベルがSERIALIZABLEの場合、古いトランザクションもSERIALIZABLEでなければなりません.古いトランザクションがread-onlyの場合、新しいトランザクションもread-onlyにする必要があります.
シーンを使用して、セッション1 export snapshot、セッション2はSET TRANSACTION SNAPSHOTを介してセッション1のsnapshotと同期する.これにより、session 1 export snapshot後に他のsessionコミットトランザクションがあるかどうかにかかわらず、session 2には影響しません.
session 1 export snapshotこのときt 1にid=897のtupleがない
[postgres@hgcndn ~]$ psql -p 5432 -U postgres -h 127.0.0.1
psql (12.4)
Type "help" for help.

postgres=# BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
postgres=# SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000000F-1
(1 row)

postgres=# select * from t1 where id=897;
 id | name
----+------
(0 rows)

session 2はcommitを行いt 1にid=897のtupleをinsertした
[postgres@hgcndn ~]$ psql -p 5432 -U postgres -h 127.0.0.1
psql (12.4)
Type "help" for help.

postgres=#
postgres=# select * from t1 where id=897;
 id | name
----+------
(0 rows)

postgres=# insert into t1 values(897, 'test');
INSERT 0 1
postgres=# select * from t1 where id=897;
 id  | name
-----+------
 897 | test
(1 row)

session 3デフォルトのread committedの独立性レベルでは、session 2がコミットした修正が見られますが、新しいトランザクションでは、SET TRANSACTION SNAPSHOTによってsession 1のexport snapshotのトランザクションと一致した後、session 2のinsertのtupleは見られません
[postgres@hgcndn ~]$ psql -p 5432 -U postgres -h 127.0.0.1
psql (12.4)
Type "help" for help.

postgres=#
postgres=# select * from t1 where id=897;
 id  | name
-----+------
 897 | test
(1 row)

postgres=#  BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
postgres=# SET TRANSACTION SNAPSHOT '00000003-0000000F-1';
SET
postgres=# select * from t1 where id=897;
 id | name
----+------
(0 rows)

参考文献https://www.postgresql.org/do... https://www.postgresql.org/do...