File tree 3 files changed +26
-5
lines changed
3 files changed +26
-5
lines changed Original file line number Diff line number Diff line change @@ -391,6 +391,28 @@ GetCurrentTransactionIdIfAny(void)
391
391
}
392
392
393
393
394
+ /*
395
+ * GetStableLatestTransactionIdIfAny
396
+ *
397
+ * Get the latest XID once and then return same value for rest of transaction.
398
+ * Acts as a useful reference point for maintenance tasks.
399
+ */
400
+ TransactionId
401
+ GetStableLatestTransactionId (void )
402
+ {
403
+ static LocalTransactionId lxid = InvalidLocalTransactionId ;
404
+ static TransactionId stablexid = InvalidTransactionId ;
405
+
406
+ if (lxid != MyProc -> lxid ||
407
+ !TransactionIdIsValid (stablexid ))
408
+ {
409
+ lxid = MyProc -> lxid ;
410
+ stablexid = ReadNewTransactionId ();
411
+ }
412
+
413
+ return stablexid ;
414
+ }
415
+
394
416
/*
395
417
* AssignTransactionId
396
418
*
Original file line number Diff line number Diff line change 19
19
#include "access/transam.h"
20
20
#include "access/xact.h"
21
21
#include "libpq/pqformat.h"
22
+ #include "storage/proc.h"
22
23
#include "utils/builtins.h"
23
24
24
25
#define PG_GETARG_TRANSACTIONID (n ) DatumGetTransactionId(PG_GETARG_DATUM(n))
@@ -87,16 +88,13 @@ xideq(PG_FUNCTION_ARGS)
87
88
}
88
89
89
90
/*
90
- * xid_age - compute age of an XID (relative to current xact )
91
+ * xid_age - compute age of an XID (relative to latest stable xid )
91
92
*/
92
93
Datum
93
94
xid_age (PG_FUNCTION_ARGS )
94
95
{
95
96
TransactionId xid = PG_GETARG_TRANSACTIONID (0 );
96
- TransactionId now = GetTopTransactionIdIfAny ();
97
-
98
- if (!TransactionIdIsValid (now ))
99
- now = ReadNewTransactionId ();
97
+ TransactionId now = GetStableLatestTransactionId ();
100
98
101
99
/* Permanent XIDs are always infinitely old */
102
100
if (!TransactionIdIsNormal (xid ))
Original file line number Diff line number Diff line change @@ -209,6 +209,7 @@ extern TransactionId GetTopTransactionId(void);
209
209
extern TransactionId GetTopTransactionIdIfAny (void );
210
210
extern TransactionId GetCurrentTransactionId (void );
211
211
extern TransactionId GetCurrentTransactionIdIfAny (void );
212
+ extern TransactionId GetStableLatestTransactionId (void );
212
213
extern SubTransactionId GetCurrentSubTransactionId (void );
213
214
extern CommandId GetCurrentCommandId (bool used );
214
215
extern TimestampTz GetCurrentTransactionStartTimestamp (void );
You can’t perform that action at this time.
0 commit comments