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文档: 快照同步函数
有用链接
- 在PostgreSQL中使用快照 - Robert Bernier / Percona 于 2022 年 9 月发表的博文