pg_export_snapshot() 是一个系统函数,它会保存事务的当前快照,并返回一个标识符,该标识符为 text 类型的值。
pg_export_snapshot() 在 PostgreSQL 9.2 中添加。
用法
pg_export_snapshot () → text
导出的快照可以被另一个会话使用,以便以与源会话完全相同的状态读取数据库。这对于例如 pg_dump 很有用,它可以使用导出的快照来实现并行转储。
可以在一个事务中导出多个快照,但请注意,只有 READ COMMITTED 事务在其生命周期内实际使用一个以上的快照。
导入到另一个事务
在一个事务中导出的快照可以使用 SET TRANSACTION SNAPSHOT '...' 导入到另一个事务中。
变更历史
- PostgreSQL 9.2
- 添加 (提交 bb446b68)
示例
pg_export_snapshot() 的基本用法示例
postgres=# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000003-00000011-1 (1 row)
请注意,在上面的示例中,由于 pg_export_snapshot() 是在事务之外执行的,因此导出的快照已失效。
从事务内部导出快照
postgres=# BEGIN
TRANSACTION ISOLATION LEVEL
REPEATABLE READ;
postgres=*# SELECT pg_export_snapshot();
pg_export_snapshot
---------------------
00000003-000001BF-1
(1 row)
现在可以将快照导入到另一个事务中
postgres=# BEGIN
TRANSACTION ISOLATION LEVEL
REPEATABLE READ;
BEGIN
postgres=*# SET TRANSACTION SNAPSHOT '00000003-000001BF-1';
SET
无法从子事务导出快照
postgres=# BEGIN; BEGIN postgres=*# SAVEPOINT s1; SAVEPOINT postgres=*# SELECT pg_export_snapshot(); ERROR: cannot export a snapshot from a subtransaction
如果事务的快照已被导出,则无法执行 PREPARE TRANSACTION
postgres=*# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000003-00000013-1 (1 row) postgres=*# PREPARE TRANSACTION 'foo'; ERROR: cannot PREPARE a transaction that has exported snapshots
参考资料
- PostgreSQL documentation: Snapshot Synchronization Functions
有用链接
- Working With Snapshots in PostgreSQL - 2022 年 9 月 Robert Bernier / Percona 的博客文章
