mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Nested transactions. There is still much left to do, especially on the
performance front, but with feature freeze upon us I think it's time to drive a stake in the ground and say that this will be in 7.5. Alvaro Herrera, with some help from Tom Lane.
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/clog.h,v 1.8 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/clog.h,v 1.9 2004/07/01 00:51:38 tgl Exp $
|
||||
*/
|
||||
#ifndef CLOG_H
|
||||
#define CLOG_H
|
||||
@@ -16,13 +16,16 @@
|
||||
/*
|
||||
* Possible transaction statuses --- note that all-zeroes is the initial
|
||||
* state.
|
||||
*
|
||||
* A "subcommitted" transaction is a committed subtransaction whose parent
|
||||
* hasn't committed or aborted yet.
|
||||
*/
|
||||
typedef int XidStatus;
|
||||
|
||||
#define TRANSACTION_STATUS_IN_PROGRESS 0x00
|
||||
#define TRANSACTION_STATUS_COMMITTED 0x01
|
||||
#define TRANSACTION_STATUS_ABORTED 0x02
|
||||
/* 0x03 is available without changing commit log space allocation */
|
||||
#define TRANSACTION_STATUS_SUB_COMMITTED 0x03
|
||||
|
||||
/* exported because lwlock.c needs it */
|
||||
#define NUM_CLOG_BUFFERS 8
|
||||
@@ -39,12 +42,6 @@ extern void ShutdownCLOG(void);
|
||||
extern void CheckPointCLOG(void);
|
||||
extern void ExtendCLOG(TransactionId newestXact);
|
||||
extern void TruncateCLOG(TransactionId oldestXact);
|
||||
|
||||
/* XLOG stuff */
|
||||
#define CLOG_ZEROPAGE 0x00
|
||||
|
||||
extern void clog_redo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void clog_undo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void clog_desc(char *buf, uint8 xl_info, char *rec);
|
||||
extern void clog_zeropage_redo(int pageno);
|
||||
|
||||
#endif /* CLOG_H */
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.22 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.23 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -23,5 +23,6 @@ extern Datum gistrestrpos(PG_FUNCTION_ARGS);
|
||||
extern Datum gistendscan(PG_FUNCTION_ARGS);
|
||||
extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum);
|
||||
extern void AtEOXact_gist(void);
|
||||
extern void AtEOSubXact_gist(TransactionId childXid);
|
||||
|
||||
#endif /* GISTSCAN_H */
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/hash.h,v 1.54 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/hash.h,v 1.55 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* modeled after Margo Seltzer's hash implementation for unix.
|
||||
@@ -293,6 +293,7 @@ extern void _hash_regscan(IndexScanDesc scan);
|
||||
extern void _hash_dropscan(IndexScanDesc scan);
|
||||
extern bool _hash_has_active_scan(Relation rel, Bucket bucket);
|
||||
extern void AtEOXact_hash(void);
|
||||
extern void AtEOSubXact_hash(TransactionId childXid);
|
||||
|
||||
/* hashsearch.c */
|
||||
extern bool _hash_next(IndexScanDesc scan, ScanDirection dir);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/htup.h,v 1.65 2004/04/01 21:28:45 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/htup.h,v 1.66 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -109,18 +109,14 @@
|
||||
typedef struct HeapTupleFields
|
||||
{
|
||||
TransactionId t_xmin; /* inserting xact ID */
|
||||
|
||||
union
|
||||
{
|
||||
CommandId t_cmin; /* inserting command ID */
|
||||
TransactionId t_xmax; /* deleting xact ID */
|
||||
} t_field2;
|
||||
CommandId t_cmin; /* inserting command ID */
|
||||
TransactionId t_xmax; /* deleting xact ID */
|
||||
|
||||
union
|
||||
{
|
||||
CommandId t_cmax; /* deleting command ID */
|
||||
TransactionId t_xvac; /* VACUUM FULL xact ID */
|
||||
} t_field3;
|
||||
} t_field4;
|
||||
} HeapTupleFields;
|
||||
|
||||
typedef struct DatumTupleFields
|
||||
@@ -172,9 +168,7 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
|
||||
* attribute(s) */
|
||||
#define HEAP_HASEXTENDED 0x000C /* the two above combined */
|
||||
#define HEAP_HASOID 0x0010 /* has an object-id field */
|
||||
/* bit 0x0020 is presently unused */
|
||||
#define HEAP_XMAX_IS_XMIN 0x0040 /* created and deleted in the same
|
||||
* transaction */
|
||||
/* 0x0020 and 0x0040 are unused */
|
||||
#define HEAP_XMAX_UNLOGGED 0x0080 /* to lock tuple for update
|
||||
* without logging */
|
||||
#define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */
|
||||
@@ -211,62 +205,47 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
|
||||
|
||||
#define HeapTupleHeaderGetXmax(tup) \
|
||||
( \
|
||||
((tup)->t_infomask & HEAP_XMAX_IS_XMIN) ? \
|
||||
(tup)->t_choice.t_heap.t_xmin \
|
||||
: \
|
||||
(tup)->t_choice.t_heap.t_field2.t_xmax \
|
||||
(tup)->t_choice.t_heap.t_xmax \
|
||||
)
|
||||
|
||||
#define HeapTupleHeaderSetXmax(tup, xid) \
|
||||
do { \
|
||||
TransactionId _newxid = (xid); \
|
||||
if (TransactionIdEquals((tup)->t_choice.t_heap.t_xmin, _newxid)) \
|
||||
(tup)->t_infomask |= HEAP_XMAX_IS_XMIN; \
|
||||
else \
|
||||
{ \
|
||||
(tup)->t_infomask &= ~HEAP_XMAX_IS_XMIN; \
|
||||
TransactionIdStore(_newxid, &(tup)->t_choice.t_heap.t_field2.t_xmax); \
|
||||
} \
|
||||
} while (0)
|
||||
( \
|
||||
TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_xmax) \
|
||||
)
|
||||
|
||||
#define HeapTupleHeaderGetCmin(tup) \
|
||||
( \
|
||||
(tup)->t_choice.t_heap.t_cmin \
|
||||
)
|
||||
|
||||
#define HeapTupleHeaderSetCmin(tup, cid) \
|
||||
( \
|
||||
(tup)->t_choice.t_heap.t_cmin = (cid) \
|
||||
)
|
||||
|
||||
/*
|
||||
* Note: GetCmin will produce wrong answers after SetXmax has been executed
|
||||
* Note: GetCmax will produce wrong answers after SetXvac has been executed
|
||||
* by a transaction other than the inserting one. We could check
|
||||
* HEAP_XMAX_INVALID and return FirstCommandId if it's clear, but since that
|
||||
* bit will be set again if the deleting transaction aborts, there'd be no
|
||||
* real gain in safety from the extra test. So, just rely on the caller not
|
||||
* to trust the value unless it's meaningful.
|
||||
*/
|
||||
#define HeapTupleHeaderGetCmin(tup) \
|
||||
( \
|
||||
(tup)->t_choice.t_heap.t_field2.t_cmin \
|
||||
)
|
||||
|
||||
#define HeapTupleHeaderSetCmin(tup, cid) \
|
||||
do { \
|
||||
Assert((tup)->t_infomask & HEAP_XMAX_INVALID); \
|
||||
(tup)->t_choice.t_heap.t_field2.t_cmin = (cid); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* As with GetCmin, we can't completely ensure that GetCmax can detect whether
|
||||
* a valid command ID is available, and there's little point in a partial test.
|
||||
*/
|
||||
#define HeapTupleHeaderGetCmax(tup) \
|
||||
( \
|
||||
(tup)->t_choice.t_heap.t_field3.t_cmax \
|
||||
(tup)->t_choice.t_heap.t_field4.t_cmax \
|
||||
)
|
||||
|
||||
#define HeapTupleHeaderSetCmax(tup, cid) \
|
||||
do { \
|
||||
Assert(!((tup)->t_infomask & HEAP_MOVED)); \
|
||||
(tup)->t_choice.t_heap.t_field3.t_cmax = (cid); \
|
||||
(tup)->t_choice.t_heap.t_field4.t_cmax = (cid); \
|
||||
} while (0)
|
||||
|
||||
#define HeapTupleHeaderGetXvac(tup) \
|
||||
( \
|
||||
((tup)->t_infomask & HEAP_MOVED) ? \
|
||||
(tup)->t_choice.t_heap.t_field3.t_xvac \
|
||||
(tup)->t_choice.t_heap.t_field4.t_xvac \
|
||||
: \
|
||||
InvalidTransactionId \
|
||||
)
|
||||
@@ -274,7 +253,7 @@ do { \
|
||||
#define HeapTupleHeaderSetXvac(tup, xid) \
|
||||
do { \
|
||||
Assert((tup)->t_infomask & HEAP_MOVED); \
|
||||
TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_field3.t_xvac); \
|
||||
TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_field4.t_xvac); \
|
||||
} while (0)
|
||||
|
||||
#define HeapTupleHeaderGetDatumLength(tup) \
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Resource managers definition
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.10 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.11 2004/07/01 00:51:38 tgl Exp $
|
||||
*/
|
||||
#ifndef RMGR_H
|
||||
#define RMGR_H
|
||||
@@ -16,7 +16,7 @@ typedef uint8 RmgrId;
|
||||
#define RM_XLOG_ID 0
|
||||
#define RM_XACT_ID 1
|
||||
#define RM_SMGR_ID 2
|
||||
#define RM_CLOG_ID 3
|
||||
#define RM_SLRU_ID 3
|
||||
#define RM_HEAP_ID 10
|
||||
#define RM_BTREE_ID 11
|
||||
#define RM_HASH_ID 12
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.32 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.33 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -130,6 +130,7 @@ extern void rtree_desc(char *buf, uint8 xl_info, char *rec);
|
||||
extern void rtadjscans(Relation r, int op, BlockNumber blkno,
|
||||
OffsetNumber offnum);
|
||||
extern void AtEOXact_rtree(void);
|
||||
extern void AtEOSubXact_rtree(TransactionId childXid);
|
||||
|
||||
/* rtstrat.c */
|
||||
extern StrategyNumber RTMapToInternalOperator(StrategyNumber strat);
|
||||
|
||||
@@ -6,11 +6,12 @@
|
||||
* Portions Copyright (c) 2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/slru.h,v 1.6 2004/05/31 03:48:08 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/slru.h,v 1.7 2004/07/01 00:51:38 tgl Exp $
|
||||
*/
|
||||
#ifndef SLRU_H
|
||||
#define SLRU_H
|
||||
|
||||
#include "access/xlog.h"
|
||||
#include "storage/lwlock.h"
|
||||
|
||||
|
||||
@@ -56,4 +57,12 @@ extern void SimpleLruSetLatestPage(SlruCtl ctl, int pageno);
|
||||
extern void SimpleLruFlush(SlruCtl ctl, bool checkpoint);
|
||||
extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage);
|
||||
|
||||
/* XLOG stuff */
|
||||
#define CLOG_ZEROPAGE 0x00
|
||||
#define SUBTRANS_ZEROPAGE 0x10
|
||||
|
||||
extern void slru_redo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void slru_undo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void slru_desc(char *buf, uint8 xl_info, char *rec);
|
||||
|
||||
#endif /* SLRU_H */
|
||||
|
||||
35
src/include/access/subtrans.h
Normal file
35
src/include/access/subtrans.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* subtrans.h
|
||||
*
|
||||
* PostgreSQL subtrans-log manager
|
||||
*
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/subtrans.h,v 1.1 2004/07/01 00:51:38 tgl Exp $
|
||||
*/
|
||||
#ifndef SUBTRANS_H
|
||||
#define SUBTRANS_H
|
||||
|
||||
#include "access/xlog.h"
|
||||
|
||||
/* exported because lwlock.c needs it */
|
||||
/* cannot be different from NUM_CLOG_BUFFERS without slru.c changes */
|
||||
#define NUM_SUBTRANS_BUFFERS NUM_CLOG_BUFFERS
|
||||
|
||||
extern void SubTransSetParent(TransactionId xid, TransactionId parent);
|
||||
extern TransactionId SubTransGetParent(TransactionId xid);
|
||||
extern TransactionId SubTransGetTopmostTransaction(TransactionId xid);
|
||||
extern bool SubTransXidsHaveCommonAncestor(TransactionId xid1, TransactionId xid2);
|
||||
|
||||
extern int SUBTRANSShmemSize(void);
|
||||
extern void SUBTRANSShmemInit(void);
|
||||
extern void BootStrapSUBTRANS(void);
|
||||
extern void StartupSUBTRANS(void);
|
||||
extern void ShutdownSUBTRANS(void);
|
||||
extern void CheckPointSUBTRANS(void);
|
||||
extern void ExtendSUBTRANS(TransactionId newestXact);
|
||||
extern void TruncateSUBTRANS(TransactionId oldestXact);
|
||||
extern void subtrans_zeropage_redo(int pageno);
|
||||
|
||||
#endif /* SUBTRANS_H */
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/transam.h,v 1.48 2003/11/29 22:40:55 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/transam.h,v 1.49 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -107,13 +107,16 @@ extern bool TransactionIdDidCommit(TransactionId transactionId);
|
||||
extern bool TransactionIdDidAbort(TransactionId transactionId);
|
||||
extern void TransactionIdCommit(TransactionId transactionId);
|
||||
extern void TransactionIdAbort(TransactionId transactionId);
|
||||
extern void TransactionIdSubCommit(TransactionId transactionId);
|
||||
extern void TransactionIdCommitTree(int nxids, TransactionId *xids);
|
||||
extern void TransactionIdAbortTree(int nxids, TransactionId *xids);
|
||||
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);
|
||||
|
||||
/* in transam/varsup.c */
|
||||
extern TransactionId GetNewTransactionId(void);
|
||||
extern TransactionId GetNewTransactionId(bool isSubXact);
|
||||
extern TransactionId ReadNewTransactionId(void);
|
||||
extern Oid GetNewObjectId(void);
|
||||
extern void CheckMaxObjectId(Oid assigned_oid);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.63 2004/05/22 23:14:38 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.64 2004/07/01 00:51:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -63,7 +63,15 @@ typedef enum TBlockState
|
||||
TBLOCK_INPROGRESS,
|
||||
TBLOCK_END,
|
||||
TBLOCK_ABORT,
|
||||
TBLOCK_ENDABORT
|
||||
TBLOCK_ENDABORT,
|
||||
|
||||
TBLOCK_SUBBEGIN,
|
||||
TBLOCK_SUBBEGINABORT,
|
||||
TBLOCK_SUBINPROGRESS,
|
||||
TBLOCK_SUBEND,
|
||||
TBLOCK_SUBABORT,
|
||||
TBLOCK_SUBENDABORT_OK,
|
||||
TBLOCK_SUBENDABORT_ERROR
|
||||
} TBlockState;
|
||||
|
||||
/*
|
||||
@@ -76,12 +84,15 @@ typedef void (*EOXactCallback) (bool isCommit, void *arg);
|
||||
*/
|
||||
typedef struct TransactionStateData
|
||||
{
|
||||
TransactionId transactionIdData;
|
||||
CommandId commandId;
|
||||
AbsoluteTime startTime;
|
||||
int startTimeUsec;
|
||||
TransState state;
|
||||
TBlockState blockState;
|
||||
TransactionId transactionIdData; /* my XID */
|
||||
CommandId commandId; /* current CID */
|
||||
TransState state; /* low-level state */
|
||||
TBlockState blockState; /* high-level state */
|
||||
int nestingLevel; /* nest depth */
|
||||
MemoryContext curTransactionContext; /* my xact-lifetime context */
|
||||
List *childXids; /* subcommitted child XIDs */
|
||||
AclId currentUser; /* subxact start current_user */
|
||||
struct TransactionStateData *parent; /* back link to parent */
|
||||
} TransactionStateData;
|
||||
|
||||
typedef TransactionStateData *TransactionState;
|
||||
@@ -102,9 +113,11 @@ typedef TransactionStateData *TransactionState;
|
||||
typedef struct xl_xact_commit
|
||||
{
|
||||
time_t xtime;
|
||||
int nrels; /* number of RelFileNodes */
|
||||
int nsubxacts; /* number of subtransaction XIDs */
|
||||
/* Array of RelFileNode(s) to drop at commit */
|
||||
/* The XLOG record length determines how many there are */
|
||||
RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
|
||||
/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
|
||||
} xl_xact_commit;
|
||||
|
||||
#define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes)
|
||||
@@ -112,9 +125,11 @@ typedef struct xl_xact_commit
|
||||
typedef struct xl_xact_abort
|
||||
{
|
||||
time_t xtime;
|
||||
int nrels; /* number of RelFileNodes */
|
||||
int nsubxacts; /* number of subtransaction XIDs */
|
||||
/* Array of RelFileNode(s) to drop at abort */
|
||||
/* The XLOG record length determines how many there are */
|
||||
RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
|
||||
/* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */
|
||||
} xl_xact_abort;
|
||||
|
||||
#define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes)
|
||||
@@ -126,18 +141,20 @@ typedef struct xl_xact_abort
|
||||
*/
|
||||
extern bool IsTransactionState(void);
|
||||
extern bool IsAbortedTransactionBlockState(void);
|
||||
extern TransactionId GetTopTransactionId(void);
|
||||
extern TransactionId GetCurrentTransactionId(void);
|
||||
extern CommandId GetCurrentCommandId(void);
|
||||
extern AbsoluteTime GetCurrentTransactionStartTime(void);
|
||||
extern AbsoluteTime GetCurrentTransactionStartTimeUsec(int *usec);
|
||||
extern int GetCurrentTransactionNestLevel(void);
|
||||
extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
|
||||
extern bool CommandIdIsCurrentCommandId(CommandId cid);
|
||||
extern void CommandCounterIncrement(void);
|
||||
extern void StartTransactionCommand(void);
|
||||
extern void CommitTransactionCommand(void);
|
||||
extern void AbortCurrentTransaction(void);
|
||||
extern void BeginTransactionBlock(void);
|
||||
extern void EndTransactionBlock(void);
|
||||
extern bool IsSubTransaction(void);
|
||||
extern bool IsTransactionBlock(void);
|
||||
extern bool IsTransactionOrTransactionBlock(void);
|
||||
extern char TransactionBlockStatusCode(void);
|
||||
@@ -151,6 +168,8 @@ extern void UnregisterEOXactCallback(EOXactCallback callback, void *arg);
|
||||
|
||||
extern void RecordTransactionCommit(void);
|
||||
|
||||
extern int xactGetCommittedChildren(TransactionId **ptr, bool metoo);
|
||||
|
||||
extern void XactPushRollback(void (*func) (void *), void *data);
|
||||
extern void XactPopRollback(void);
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.51 2004/05/29 22:48:22 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.52 2004/07/01 00:51:38 tgl Exp $
|
||||
*/
|
||||
#ifndef XLOG_H
|
||||
#define XLOG_H
|
||||
@@ -111,7 +111,7 @@ typedef struct XLogContRecord
|
||||
/*
|
||||
* Each page of XLOG file has a header like this:
|
||||
*/
|
||||
#define XLOG_PAGE_MAGIC 0xD05A /* can be used as WAL version indicator */
|
||||
#define XLOG_PAGE_MAGIC 0xD05B /* can be used as WAL version indicator */
|
||||
|
||||
typedef struct XLogPageHeaderData
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user