事务中的所有内容都在发生时写入复制槽。如果事务被回滚,则回滚被输入到 WAL。如果流在事务中间中断,则不会在订阅者端提交事务,至少在重新建立连接之前不会提交。
测试这一点的一种方法是创建一个复制槽,然后在另一个终端中,使用以下命令查看更改pg_recvlogical
:
pg_recvlogical -d postgres --slot <slot_name> --start --verbose -f -
如果你BEGIN
是一个事务,创建一个表并在其中插入一百万行,你会看到write up to
和flush to
值在增加,即使事务没有被提交/回滚。这告诉我们更改正在传播到接收端:
# pg_recvlogical -d postgres --slot regression_slot --start --verbose -f -
pg_recvlogical: starting log streaming at 0/0 (slot regression_slot)
pg_recvlogical: streaming initiated
pg_recvlogical: confirming write up to 0/0, flush to 0/0 (slot regression_slot)
pg_recvlogical: confirming write up to 0/DF5E620, flush to 0/DF5E620 (slot regression_slot)
pg_recvlogical: confirming write up to 0/DF5E620, flush to 0/DF5E620 (slot regression_slot)
pg_recvlogical: confirming write up to 0/12E01AB8, flush to 0/12E01AB8 (slot regression_slot)
pg_recvlogical: confirming write up to 0/12E01AF0, flush to 0/12E01AF0 (slot regression_slot)
此外,如果您pg_current_wal_lsn()
在事务结束之前和之后在终端中查看,您会看到 LSN 增加了,即使您回滚了:
pg_current_wal_lsn
--------------------
0/DF5E620
(1 row)
postgres=# begin;
BEGIN
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/DF5E620
(1 row)
postgres=# insert into abc values (generate_series(1,1000000),'foobar');
INSERT 0 1000000
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1243C000
(1 row)
postgres=# rollback;
ROLLBACK
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/12E01AB8
(1 row)