mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-11 19:20:40 +08:00
Commit 0aa8a01d04
extends the output plugin API to allow decoding of
prepared xacts and allowed the user to enable/disable the two-phase option
via pg_logical_slot_get_changes(). This can lead to a problem such that
the first time when it gets changes via pg_logical_slot_get_changes()
without two_phase option enabled it will not get the prepared even though
prepare is after consistent snapshot. Now next time during getting changes,
if the two_phase option is enabled it can skip prepare because by that
time start decoding point has been moved. So the user will only get commit
prepared.
Allow to enable/disable this option at the create slot time and default
will be false. It will break the existing slots which is fine in a major
release.
Author: Ajin Cherian
Reviewed-by: Amit Kapila and Vignesh C
Discussion: https://postgr.es/m/d0f60d60-133d-bf8d-bd70-47784d8fabf3@enterprisedb.com
42 lines
1.3 KiB
Plaintext
42 lines
1.3 KiB
Plaintext
Parsed test spec with 3 sessions
|
|
|
|
starting permutation: s2b s2txid s1init s3b s3txid s2c s2b s2insert s2p s3c s1insert s1start s2cp s1start
|
|
step s2b: BEGIN;
|
|
step s2txid: SELECT pg_current_xact_id() IS NULL;
|
|
?column?
|
|
|
|
f
|
|
step s1init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding', false, true); <waiting ...>
|
|
step s3b: BEGIN;
|
|
step s3txid: SELECT pg_current_xact_id() IS NULL;
|
|
?column?
|
|
|
|
f
|
|
step s2c: COMMIT;
|
|
step s2b: BEGIN;
|
|
step s2insert: INSERT INTO do_write DEFAULT VALUES;
|
|
step s2p: PREPARE TRANSACTION 'test1';
|
|
step s3c: COMMIT;
|
|
step s1init: <... completed>
|
|
?column?
|
|
|
|
init
|
|
step s1insert: INSERT INTO do_write DEFAULT VALUES;
|
|
step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'skip-empty-xacts', '1');
|
|
data
|
|
|
|
BEGIN
|
|
table public.do_write: INSERT: id[integer]:2
|
|
COMMIT
|
|
step s2cp: COMMIT PREPARED 'test1';
|
|
step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'skip-empty-xacts', '1');
|
|
data
|
|
|
|
BEGIN
|
|
table public.do_write: INSERT: id[integer]:1
|
|
PREPARE TRANSACTION 'test1'
|
|
COMMIT PREPARED 'test1'
|
|
?column?
|
|
|
|
stop
|