diff --git a/src/gausskernel/storage/access/transam/twophase.cpp b/src/gausskernel/storage/access/transam/twophase.cpp index b02705887..4cfebab54 100755 --- a/src/gausskernel/storage/access/transam/twophase.cpp +++ b/src/gausskernel/storage/access/transam/twophase.cpp @@ -2079,6 +2079,14 @@ void FinishPreparedTransaction(const char* gid, bool isCommit) * callbacks will release the locks the transaction held. */ if (isCommit) { + CommitSeqNo csn = SetXact2CommitInProgress(xid, 0); + if (XLogStandbyInfoActive()) { + XLogBeginInsert(); + XLogRegisterData((char*)(&xid), sizeof(TransactionId)); + XLogRegisterData((char*)(&csn), sizeof(CommitSeqNo)); + XLogInsert(RM_STANDBY_ID, XLOG_STANDBY_CSN_COMMITTING); + } + setCommitCsn(getNextCSN()); pgxact->needToSyncXid = true; RecordTransactionCommitPrepared(xid, hdr->nsubxacts, diff --git a/src/test/regress/expected/transactions.out b/src/test/regress/expected/transactions.out index 8c4c9860f..bc648cef6 100644 --- a/src/test/regress/expected/transactions.out +++ b/src/test/regress/expected/transactions.out @@ -614,6 +614,58 @@ fetch from foo; (1 row) abort; +-- Test for prepared xacts +create table prepared_xact_test(a int); +start transaction; +insert into prepared_xact_test values (1); +prepare transaction 'pxact1'; +commit; +WARNING: there is no transaction in progress +select * from prepared_xact_test; + a +--- +(0 rows) + +select gid from pg_prepared_xacts; + gid +-------- + pxact1 +(1 row) + +commit prepared 'pxact1'; +select * from prepared_xact_test; + a +--- + 1 +(1 row) + +select * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +begin; +insert into prepared_xact_test values (2); +prepare transaction 'pxact2'; +select gid from pg_prepared_xacts; + gid +-------- + pxact2 +(1 row) + +rollback prepared 'pxact2'; +select * from prepared_xact_test; + a +--- + 1 +(1 row) + +select * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +drop table prepared_xact_test; -- Test for proper cleanup after a failure in a cursor portal -- that was created in an outer subtransaction CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS diff --git a/src/test/regress/sql/transactions.sql b/src/test/regress/sql/transactions.sql index 80c661635..52fe48db5 100644 --- a/src/test/regress/sql/transactions.sql +++ b/src/test/regress/sql/transactions.sql @@ -368,6 +368,28 @@ fetch from foo; abort; +-- Test for prepared xacts +create table prepared_xact_test(a int); +start transaction; +insert into prepared_xact_test values (1); +prepare transaction 'pxact1'; +commit; +select * from prepared_xact_test; +select gid from pg_prepared_xacts; +commit prepared 'pxact1'; +select * from prepared_xact_test; +select * from pg_prepared_xacts; + +begin; +insert into prepared_xact_test values (2); +prepare transaction 'pxact2'; +select gid from pg_prepared_xacts; +rollback prepared 'pxact2'; +select * from prepared_xact_test; +select * from pg_prepared_xacts; + +drop table prepared_xact_test; + -- Test for proper cleanup after a failure in a cursor portal -- that was created in an outer subtransaction CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS