1996-08-27 23:50:29 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* transam.h
|
2001-07-12 06:11:13 +02:00
|
|
|
* postgres transaction access method support code
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
|
|
|
*
|
2019-01-02 18:44:25 +01:00
|
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
2000-01-26 06:58:53 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
2010-09-20 22:08:53 +02:00
|
|
|
* src/include/access/transam.h
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef TRANSAM_H
|
|
|
|
#define TRANSAM_H
|
|
|
|
|
2007-08-02 00:45:09 +02:00
|
|
|
#include "access/xlogdefs.h"
|
|
|
|
|
2001-07-12 06:11:13 +02:00
|
|
|
|
1996-08-27 23:50:29 +02:00
|
|
|
/* ----------------
|
2001-07-12 06:11:13 +02:00
|
|
|
* Special transaction ID values
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
2001-08-25 20:52:43 +02:00
|
|
|
* BootstrapTransactionId is the XID for "bootstrap" operations, and
|
|
|
|
* FrozenTransactionId is used for very old tuples. Both should
|
2001-08-24 01:06:38 +02:00
|
|
|
* always be considered valid.
|
2001-07-12 06:11:13 +02:00
|
|
|
*
|
2001-08-24 01:06:38 +02:00
|
|
|
* FirstNormalTransactionId is the first "normal" transaction id.
|
Fix recently-understood problems with handling of XID freezing, particularly
in PITR scenarios. We now WAL-log the replacement of old XIDs with
FrozenTransactionId, so that such replacement is guaranteed to propagate to
PITR slave databases. Also, rather than relying on hint-bit updates to be
preserved, pg_clog is not truncated until all instances of an XID are known to
have been replaced by FrozenTransactionId. Add new GUC variables and
pg_autovacuum columns to allow management of the freezing policy, so that
users can trade off the size of pg_clog against the amount of freezing work
done. Revise the already-existing code that forces autovacuum of tables
approaching the wraparound point to make it more bulletproof; also, revise the
autovacuum logic so that anti-wraparound vacuuming is done per-table rather
than per-database. initdb forced because of changes in pg_class, pg_database,
and pg_autovacuum catalogs. Heikki Linnakangas, Simon Riggs, and Tom Lane.
2006-11-05 23:42:10 +01:00
|
|
|
* Note: if you need to change it, you must change pg_class.h as well.
|
2001-07-12 06:11:13 +02:00
|
|
|
* ----------------
|
|
|
|
*/
|
2001-08-24 01:06:38 +02:00
|
|
|
#define InvalidTransactionId ((TransactionId) 0)
|
2001-08-25 20:52:43 +02:00
|
|
|
#define BootstrapTransactionId ((TransactionId) 1)
|
|
|
|
#define FrozenTransactionId ((TransactionId) 2)
|
|
|
|
#define FirstNormalTransactionId ((TransactionId) 3)
|
2001-08-26 18:56:03 +02:00
|
|
|
#define MaxTransactionId ((TransactionId) 0xFFFFFFFF)
|
2001-07-12 06:11:13 +02:00
|
|
|
|
|
|
|
/* ----------------
|
|
|
|
* transaction ID manipulation macros
|
1996-08-27 23:50:29 +02:00
|
|
|
* ----------------
|
|
|
|
*/
|
2001-08-24 01:06:38 +02:00
|
|
|
#define TransactionIdIsValid(xid) ((xid) != InvalidTransactionId)
|
|
|
|
#define TransactionIdIsNormal(xid) ((xid) >= FirstNormalTransactionId)
|
2001-08-26 18:56:03 +02:00
|
|
|
#define TransactionIdEquals(id1, id2) ((id1) == (id2))
|
2001-08-24 01:06:38 +02:00
|
|
|
#define TransactionIdStore(xid, dest) (*(dest) = (xid))
|
2001-10-25 07:50:21 +02:00
|
|
|
#define StoreInvalidTransactionId(dest) (*(dest) = InvalidTransactionId)
|
2007-09-08 22:31:15 +02:00
|
|
|
|
2019-03-27 22:34:43 +01:00
|
|
|
#define EpochFromFullTransactionId(x) ((uint32) ((x).value >> 32))
|
|
|
|
#define XidFromFullTransactionId(x) ((uint32) (x).value)
|
|
|
|
#define U64FromFullTransactionId(x) ((x).value)
|
|
|
|
#define FullTransactionIdPrecedes(a, b) ((a).value < (b).value)
|
|
|
|
#define FullTransactionIdIsValid(x) TransactionIdIsValid(XidFromFullTransactionId(x))
|
2019-03-27 22:59:19 +01:00
|
|
|
#define InvalidFullTransactionId FullTransactionIdFromEpochAndXid(0, InvalidTransactionId)
|
2019-03-27 22:34:43 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* A 64 bit value that contains an epoch and a TransactionId. This is
|
|
|
|
* wrapped in a struct to prevent implicit conversion to/from TransactionId.
|
|
|
|
* Not all values represent valid normal XIDs.
|
|
|
|
*/
|
|
|
|
typedef struct FullTransactionId
|
|
|
|
{
|
|
|
|
uint64 value;
|
|
|
|
} FullTransactionId;
|
|
|
|
|
|
|
|
static inline FullTransactionId
|
|
|
|
FullTransactionIdFromEpochAndXid(uint32 epoch, TransactionId xid)
|
|
|
|
{
|
|
|
|
FullTransactionId result;
|
|
|
|
|
|
|
|
result.value = ((uint64) epoch) << 32 | xid;
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-08-24 01:06:38 +02:00
|
|
|
/* advance a transaction ID variable, handling wraparound correctly */
|
|
|
|
#define TransactionIdAdvance(dest) \
|
|
|
|
do { \
|
|
|
|
(dest)++; \
|
|
|
|
if ((dest) < FirstNormalTransactionId) \
|
|
|
|
(dest) = FirstNormalTransactionId; \
|
|
|
|
} while(0)
|
1996-08-27 23:50:29 +02:00
|
|
|
|
2019-03-27 22:34:43 +01:00
|
|
|
/* advance a FullTransactionId variable, stepping over special XIDs */
|
|
|
|
static inline void
|
|
|
|
FullTransactionIdAdvance(FullTransactionId *dest)
|
|
|
|
{
|
|
|
|
dest->value++;
|
|
|
|
while (XidFromFullTransactionId(*dest) < FirstNormalTransactionId)
|
|
|
|
dest->value++;
|
|
|
|
}
|
|
|
|
|
2007-09-08 22:31:15 +02:00
|
|
|
/* back up a transaction ID variable, handling wraparound correctly */
|
|
|
|
#define TransactionIdRetreat(dest) \
|
|
|
|
do { \
|
|
|
|
(dest)--; \
|
|
|
|
} while ((dest) < FirstNormalTransactionId)
|
|
|
|
|
2011-12-17 03:44:26 +01:00
|
|
|
/* compare two XIDs already known to be normal; this is a macro for speed */
|
|
|
|
#define NormalTransactionIdPrecedes(id1, id2) \
|
|
|
|
(AssertMacro(TransactionIdIsNormal(id1) && TransactionIdIsNormal(id2)), \
|
|
|
|
(int32) ((id1) - (id2)) < 0)
|
1996-08-27 23:50:29 +02:00
|
|
|
|
Introduce logical decoding.
This feature, building on previous commits, allows the write-ahead log
stream to be decoded into a series of logical changes; that is,
inserts, updates, and deletes and the transactions which contain them.
It is capable of handling decoding even across changes to the schema
of the effected tables. The output format is controlled by a
so-called "output plugin"; an example is included. To make use of
this in a real replication system, the output plugin will need to be
modified to produce output in the format appropriate to that system,
and to perform filtering.
Currently, information can be extracted from the logical decoding
system only via SQL; future commits will add the ability to stream
changes via walsender.
Andres Freund, with review and other contributions from many other
people, including Álvaro Herrera, Abhijit Menon-Sen, Peter Gheogegan,
Kevin Grittner, Robert Haas, Heikki Linnakangas, Fujii Masao, Abhijit
Menon-Sen, Michael Paquier, Simon Riggs, Craig Ringer, and Steve
Singer.
2014-03-03 22:32:18 +01:00
|
|
|
/* compare two XIDs already known to be normal; this is a macro for speed */
|
|
|
|
#define NormalTransactionIdFollows(id1, id2) \
|
|
|
|
(AssertMacro(TransactionIdIsNormal(id1) && TransactionIdIsNormal(id2)), \
|
|
|
|
(int32) ((id1) - (id2)) > 0)
|
|
|
|
|
1996-08-27 23:50:29 +02:00
|
|
|
/* ----------
|
2001-08-10 20:57:42 +02:00
|
|
|
* Object ID (OID) zero is InvalidOid.
|
|
|
|
*
|
2018-12-13 23:50:57 +01:00
|
|
|
* OIDs 1-9999 are reserved for manual assignment (see .dat files in
|
2019-03-14 05:23:33 +01:00
|
|
|
* src/include/catalog/). Of these, 8000-9999 are reserved for
|
|
|
|
* development purposes (such as in-progress patches and forks);
|
|
|
|
* they should not appear in released versions.
|
2001-08-10 20:57:42 +02:00
|
|
|
*
|
2019-03-14 05:23:33 +01:00
|
|
|
* OIDs 10000-11999 are reserved for assignment by genbki.pl, for use
|
|
|
|
* when the .dat files in src/include/catalog/ do not specify an OID
|
|
|
|
* for a catalog entry that requires one.
|
2018-12-13 23:50:57 +01:00
|
|
|
*
|
|
|
|
* OIDS 12000-16383 are reserved for assignment during initdb
|
|
|
|
* using the OID generator. (We start the generator at 12000.)
|
2001-08-10 20:57:42 +02:00
|
|
|
*
|
2005-04-13 20:54:57 +02:00
|
|
|
* OIDs beginning at 16384 are assigned from the OID generator
|
2014-05-06 18:12:18 +02:00
|
|
|
* during normal multiuser operation. (We force the generator up to
|
2005-04-13 20:54:57 +02:00
|
|
|
* 16384 as soon as we are in normal operation.)
|
2001-08-10 20:57:42 +02:00
|
|
|
*
|
2019-03-14 05:23:33 +01:00
|
|
|
* The choices of 8000, 10000 and 12000 are completely arbitrary, and can be
|
|
|
|
* moved if we run low on OIDs in any category. Changing the macros below,
|
|
|
|
* and updating relevant documentation (see bki.sgml and RELEASE_CHANGES),
|
|
|
|
* should be sufficient to do this. Moving the 16384 boundary between
|
|
|
|
* initdb-assigned OIDs and user-defined objects would be substantially
|
|
|
|
* more painful, however, since some user-defined OIDs will appear in
|
|
|
|
* on-disk data; such a change would probably break pg_upgrade.
|
2001-08-10 20:57:42 +02:00
|
|
|
*
|
2005-04-13 20:54:57 +02:00
|
|
|
* NOTE: if the OID generator wraps around, we skip over OIDs 0-16383
|
2001-08-10 20:57:42 +02:00
|
|
|
* and resume with 16384. This minimizes the odds of OID conflict, by not
|
|
|
|
* reassigning OIDs that might have been assigned during initdb.
|
1996-08-27 23:50:29 +02:00
|
|
|
* ----------
|
|
|
|
*/
|
2018-12-13 23:50:57 +01:00
|
|
|
#define FirstGenbkiObjectId 10000
|
|
|
|
#define FirstBootstrapObjectId 12000
|
2005-04-13 20:54:57 +02:00
|
|
|
#define FirstNormalObjectId 16384
|
1996-08-27 23:50:29 +02:00
|
|
|
|
1998-07-21 08:17:39 +02:00
|
|
|
/*
|
2007-09-08 22:31:15 +02:00
|
|
|
* VariableCache is a data structure in shared memory that is used to track
|
|
|
|
* OID and XID assignment state. For largely historical reasons, there is
|
|
|
|
* just one struct with different fields that are protected by different
|
|
|
|
* LWLocks.
|
2005-02-20 03:22:07 +01:00
|
|
|
*
|
2009-08-31 04:23:23 +02:00
|
|
|
* Note: xidWrapLimit and oldestXidDB are not "active" values, but are
|
2005-02-20 03:22:07 +01:00
|
|
|
* used just to generate useful messages when xidWarnLimit or xidStopLimit
|
|
|
|
* are exceeded.
|
1998-07-21 08:17:39 +02:00
|
|
|
*/
|
|
|
|
typedef struct VariableCacheData
|
|
|
|
{
|
2007-09-08 22:31:15 +02:00
|
|
|
/*
|
|
|
|
* These fields are protected by OidGenLock.
|
|
|
|
*/
|
2001-03-22 05:01:46 +01:00
|
|
|
Oid nextOid; /* next OID to assign */
|
|
|
|
uint32 oidCount; /* OIDs available before must do XLOG work */
|
2007-09-08 22:31:15 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* These fields are protected by XidGenLock.
|
|
|
|
*/
|
2019-03-27 22:34:43 +01:00
|
|
|
FullTransactionId nextFullXid; /* next full XID to assign */
|
Fix recently-understood problems with handling of XID freezing, particularly
in PITR scenarios. We now WAL-log the replacement of old XIDs with
FrozenTransactionId, so that such replacement is guaranteed to propagate to
PITR slave databases. Also, rather than relying on hint-bit updates to be
preserved, pg_clog is not truncated until all instances of an XID are known to
have been replaced by FrozenTransactionId. Add new GUC variables and
pg_autovacuum columns to allow management of the freezing policy, so that
users can trade off the size of pg_clog against the amount of freezing work
done. Revise the already-existing code that forces autovacuum of tables
approaching the wraparound point to make it more bulletproof; also, revise the
autovacuum logic so that anti-wraparound vacuuming is done per-table rather
than per-database. initdb forced because of changes in pg_class, pg_database,
and pg_autovacuum catalogs. Heikki Linnakangas, Simon Riggs, and Tom Lane.
2006-11-05 23:42:10 +01:00
|
|
|
|
|
|
|
TransactionId oldestXid; /* cluster-wide minimum datfrozenxid */
|
|
|
|
TransactionId xidVacLimit; /* start forcing autovacuums here */
|
2005-10-15 04:49:52 +02:00
|
|
|
TransactionId xidWarnLimit; /* start complaining here */
|
2019-03-27 22:34:43 +01:00
|
|
|
TransactionId xidStopLimit; /* refuse to advance nextFullXid beyond here */
|
2005-10-15 04:49:52 +02:00
|
|
|
TransactionId xidWrapLimit; /* where the world ends */
|
2009-08-31 04:23:23 +02:00
|
|
|
Oid oldestXidDB; /* database with minimum datfrozenxid */
|
2007-09-08 22:31:15 +02:00
|
|
|
|
Keep track of transaction commit timestamps
Transactions can now set their commit timestamp directly as they commit,
or an external transaction commit timestamp can be fed from an outside
system using the new function TransactionTreeSetCommitTsData(). This
data is crash-safe, and truncated at Xid freeze point, same as pg_clog.
This module is disabled by default because it causes a performance hit,
but can be enabled in postgresql.conf requiring only a server restart.
A new test in src/test/modules is included.
Catalog version bumped due to the new subdirectory within PGDATA and a
couple of new SQL functions.
Authors: Álvaro Herrera and Petr Jelínek
Reviewed to varying degrees by Michael Paquier, Andres Freund, Robert
Haas, Amit Kapila, Fujii Masao, Jaime Casanova, Simon Riggs, Steven
Singer, Peter Eisentraut
2014-12-03 15:53:02 +01:00
|
|
|
/*
|
|
|
|
* These fields are protected by CommitTsLock
|
|
|
|
*/
|
2015-12-28 21:34:11 +01:00
|
|
|
TransactionId oldestCommitTsXid;
|
|
|
|
TransactionId newestCommitTsXid;
|
Keep track of transaction commit timestamps
Transactions can now set their commit timestamp directly as they commit,
or an external transaction commit timestamp can be fed from an outside
system using the new function TransactionTreeSetCommitTsData(). This
data is crash-safe, and truncated at Xid freeze point, same as pg_clog.
This module is disabled by default because it causes a performance hit,
but can be enabled in postgresql.conf requiring only a server restart.
A new test in src/test/modules is included.
Catalog version bumped due to the new subdirectory within PGDATA and a
couple of new SQL functions.
Authors: Álvaro Herrera and Petr Jelínek
Reviewed to varying degrees by Michael Paquier, Andres Freund, Robert
Haas, Amit Kapila, Fujii Masao, Jaime Casanova, Simon Riggs, Steven
Singer, Peter Eisentraut
2014-12-03 15:53:02 +01:00
|
|
|
|
2007-09-08 22:31:15 +02:00
|
|
|
/*
|
|
|
|
* These fields are protected by ProcArrayLock.
|
|
|
|
*/
|
|
|
|
TransactionId latestCompletedXid; /* newest XID that has committed or
|
|
|
|
* aborted */
|
2017-03-23 19:08:23 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* These fields are protected by CLogTruncationLock
|
|
|
|
*/
|
|
|
|
TransactionId oldestClogXid; /* oldest it's safe to look up in clog */
|
|
|
|
|
1999-05-26 00:43:53 +02:00
|
|
|
} VariableCacheData;
|
1998-07-21 08:17:39 +02:00
|
|
|
|
1998-09-01 06:40:42 +02:00
|
|
|
typedef VariableCacheData *VariableCache;
|
1998-07-21 08:17:39 +02:00
|
|
|
|
2001-07-12 06:11:13 +02:00
|
|
|
|
1996-08-27 23:50:29 +02:00
|
|
|
/* ----------------
|
1997-09-07 07:04:48 +02:00
|
|
|
* extern declarations
|
1996-08-27 23:50:29 +02:00
|
|
|
* ----------------
|
|
|
|
*/
|
|
|
|
|
Allow read only connections during recovery, known as Hot Standby.
Enabled by recovery_connections = on (default) and forcing archive recovery using a recovery.conf. Recovery processing now emulates the original transactions as they are replayed, providing full locking and MVCC behaviour for read only queries. Recovery must enter consistent state before connections are allowed, so there is a delay, typically short, before connections succeed. Replay of recovering transactions can conflict and in some cases deadlock with queries during recovery; these result in query cancellation after max_standby_delay seconds have expired. Infrastructure changes have minor effects on normal running, though introduce four new types of WAL record.
New test mode "make standbycheck" allows regression tests of static command behaviour on a standby server while in recovery. Typical and extreme dynamic behaviours have been checked via code inspection and manual testing. Few port specific behaviours have been utilised, though primary testing has been on Linux only so far.
This commit is the basic patch. Additional changes will follow in this release to enhance some aspects of behaviour, notably improved handling of conflicts, deadlock detection and query cancellation. Changes to VACUUM FULL are also required.
Simon Riggs, with significant and lengthy review by Heikki Linnakangas, including streamlined redesign of snapshot creation and two-phase commit.
Important contributions from Florian Pflug, Mark Kirkwood, Merlin Moncure, Greg Stark, Gianni Ciolli, Gabriele Bartolini, Hannu Krosing, Robert Haas, Tatsuo Ishii, Hiroyuki Yamada plus support and feedback from many other community members.
2009-12-19 02:32:45 +01:00
|
|
|
/* in transam/xact.c */
|
|
|
|
extern bool TransactionStartedDuringRecovery(void);
|
|
|
|
|
2002-05-25 22:00:12 +02:00
|
|
|
/* in transam/varsup.c */
|
2009-05-08 05:21:35 +02:00
|
|
|
extern PGDLLIMPORT VariableCache ShmemVariableCache;
|
2002-05-25 22:00:12 +02:00
|
|
|
|
1996-08-27 23:50:29 +02:00
|
|
|
/*
|
|
|
|
* prototypes for functions in transam/transam.c
|
|
|
|
*/
|
1997-09-08 04:41:22 +02:00
|
|
|
extern bool TransactionIdDidCommit(TransactionId transactionId);
|
|
|
|
extern bool TransactionIdDidAbort(TransactionId transactionId);
|
2008-03-11 21:20:35 +01:00
|
|
|
extern bool TransactionIdIsKnownCompleted(TransactionId transactionId);
|
2008-10-20 21:18:18 +02:00
|
|
|
extern void TransactionIdCommitTree(TransactionId xid, int nxids, TransactionId *xids);
|
|
|
|
extern void TransactionIdAsyncCommitTree(TransactionId xid, int nxids, TransactionId *xids, XLogRecPtr lsn);
|
|
|
|
extern void TransactionIdAbortTree(TransactionId xid, int nxids, TransactionId *xids);
|
2001-08-26 18:56:03 +02:00
|
|
|
extern bool TransactionIdPrecedes(TransactionId id1, TransactionId id2);
|
|
|
|
extern bool TransactionIdPrecedesOrEquals(TransactionId id1, TransactionId id2);
|
|
|
|
extern bool TransactionIdFollows(TransactionId id1, TransactionId id2);
|
|
|
|
extern bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2);
|
2007-09-08 22:31:15 +02:00
|
|
|
extern TransactionId TransactionIdLatest(TransactionId mainxid,
|
2019-05-22 19:04:48 +02:00
|
|
|
int nxids, const TransactionId *xids);
|
2007-08-02 00:45:09 +02:00
|
|
|
extern XLogRecPtr TransactionIdGetCommitLSN(TransactionId xid);
|
1996-08-27 23:50:29 +02:00
|
|
|
|
|
|
|
/* in transam/varsup.c */
|
2019-03-27 22:59:19 +01:00
|
|
|
extern FullTransactionId GetNewTransactionId(bool isSubXact);
|
2019-03-27 22:34:43 +01:00
|
|
|
extern void AdvanceNextFullTransactionIdPastXid(TransactionId xid);
|
|
|
|
extern FullTransactionId ReadNextFullTransactionId(void);
|
Fix recently-understood problems with handling of XID freezing, particularly
in PITR scenarios. We now WAL-log the replacement of old XIDs with
FrozenTransactionId, so that such replacement is guaranteed to propagate to
PITR slave databases. Also, rather than relying on hint-bit updates to be
preserved, pg_clog is not truncated until all instances of an XID are known to
have been replaced by FrozenTransactionId. Add new GUC variables and
pg_autovacuum columns to allow management of the freezing policy, so that
users can trade off the size of pg_clog against the amount of freezing work
done. Revise the already-existing code that forces autovacuum of tables
approaching the wraparound point to make it more bulletproof; also, revise the
autovacuum logic so that anti-wraparound vacuuming is done per-table rather
than per-database. initdb forced because of changes in pg_class, pg_database,
and pg_autovacuum catalogs. Heikki Linnakangas, Simon Riggs, and Tom Lane.
2006-11-05 23:42:10 +01:00
|
|
|
extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid,
|
2019-05-22 19:04:48 +02:00
|
|
|
Oid oldest_datoid);
|
2017-03-23 19:08:23 +01:00
|
|
|
extern void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid);
|
2009-09-01 06:46:49 +02:00
|
|
|
extern bool ForceTransactionIdLimitUpdate(void);
|
2001-08-10 20:57:42 +02:00
|
|
|
extern Oid GetNewObjectId(void);
|
1996-08-27 23:50:29 +02:00
|
|
|
|
2019-05-22 16:38:21 +02:00
|
|
|
/*
|
|
|
|
* Some frontend programs include this header. For compilers that emit static
|
|
|
|
* inline functions even when they're unused, that leads to unsatisfied
|
|
|
|
* external references; hence hide them with #ifndef FRONTEND.
|
|
|
|
*/
|
|
|
|
#ifndef FRONTEND
|
|
|
|
|
2019-03-27 22:34:43 +01:00
|
|
|
/*
|
|
|
|
* For callers that just need the XID part of the next transaction ID.
|
|
|
|
*/
|
|
|
|
static inline TransactionId
|
|
|
|
ReadNewTransactionId(void)
|
|
|
|
{
|
|
|
|
return XidFromFullTransactionId(ReadNextFullTransactionId());
|
|
|
|
}
|
|
|
|
|
2019-05-22 16:38:21 +02:00
|
|
|
#endif /* FRONTEND */
|
|
|
|
|
|
|
|
#endif /* TRANSAM_H */
|