diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index 11e1446cd11..d37cc2821ad 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -952,7 +952,7 @@ static inline FullTransactionId
 AdjustToFullTransactionId(TransactionId xid)
 {
 	FullTransactionId nextFullXid;
-	TransactionId nextXid;
+	TransactionId cutoffXid;
 	uint32		epoch;
 
 	Assert(TransactionIdIsValid(xid));
@@ -961,9 +961,9 @@ AdjustToFullTransactionId(TransactionId xid)
 	nextFullXid = TransamVariables->nextXid;
 	LWLockRelease(XidGenLock);
 
-	nextXid = XidFromFullTransactionId(nextFullXid);
+	cutoffXid = XidFromFullTransactionId(nextFullXid);
 	epoch = EpochFromFullTransactionId(nextFullXid);
-	if (unlikely(xid > nextXid))
+	if (unlikely(xid > cutoffXid))
 	{
 		/* Wraparound occurred, must be from a prev epoch. */
 		Assert(epoch > 0);
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 976f7856fbf..15a28788d51 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -1053,6 +1053,7 @@ void
 ProcArrayApplyRecoveryInfo(RunningTransactions running)
 {
 	TransactionId *xids;
+	TransactionId xid;
 	int			nxids;
 	int			i;
 
@@ -1066,6 +1067,16 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
 	 */
 	ExpireOldKnownAssignedTransactionIds(running->oldestRunningXid);
 
+	/*
+	 * Adjust TransamVariables->nextXid before StandbyReleaseOldLocks(),
+	 * because we will need it up to date for accessing two-phase transactions
+	 * in StandbyReleaseOldLocks().
+	 */
+	xid = running->nextXid;
+	TransactionIdRetreat(xid);
+	AdvanceNextFullTransactionIdPastXid(xid);
+	Assert(FullTransactionIdIsValid(TransamVariables->nextXid));
+
 	/*
 	 * Remove stale locks, if any.
 	 */
@@ -1275,11 +1286,6 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
 
 	LWLockRelease(ProcArrayLock);
 
-	/* TransamVariables->nextXid must be beyond any observed xid. */
-	AdvanceNextFullTransactionIdPastXid(latestObservedXid);
-
-	Assert(FullTransactionIdIsValid(TransamVariables->nextXid));
-
 	KnownAssignedXidsDisplay(DEBUG3);
 	if (standbyState == STANDBY_SNAPSHOT_READY)
 		elog(DEBUG1, "recovery snapshots are now enabled");
