1 /*-------------------------------------------------------------------------
4 * postgres transaction system definitions
7 * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.81 2006/03/24 04:32:13 tgl Exp $
12 *-------------------------------------------------------------------------
17 #include "access/xlog.h"
18 #include "storage/relfilenode.h"
19 #include "nodes/pg_list.h"
20 #include "utils/timestamp.h"
24 * Xact isolation levels
26 #define XACT_READ_UNCOMMITTED 0
27 #define XACT_READ_COMMITTED 1
28 #define XACT_REPEATABLE_READ 2
29 #define XACT_SERIALIZABLE 3
31 extern int DefaultXactIsoLevel;
32 extern int XactIsoLevel;
35 * We only implement two isolation levels internally. This macro should
36 * be used to check which one is selected.
38 #define IsXactIsoLevelSerializable (XactIsoLevel >= XACT_REPEATABLE_READ)
40 /* Xact read-only state */
41 extern bool DefaultXactReadOnly;
42 extern bool XactReadOnly;
45 * start- and end-of-transaction callbacks for dynamically loaded modules
54 typedef void (*XactCallback) (XactEvent event, void *arg);
58 SUBXACT_EVENT_START_SUB,
59 SUBXACT_EVENT_COMMIT_SUB,
60 SUBXACT_EVENT_ABORT_SUB
63 typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
64 SubTransactionId parentSubid, void *arg);
68 * transaction-related XLOG entries
73 * XLOG allows to store some information in high 4 bits of log
74 * record xl_info field
76 #define XLOG_XACT_COMMIT 0x00
77 #define XLOG_XACT_PREPARE 0x10
78 #define XLOG_XACT_ABORT 0x20
79 #define XLOG_XACT_COMMIT_PREPARED 0x30
80 #define XLOG_XACT_ABORT_PREPARED 0x40
82 typedef struct xl_xact_commit
85 int nrels; /* number of RelFileNodes */
86 int nsubxacts; /* number of subtransaction XIDs */
87 /* Array of RelFileNode(s) to drop at commit */
88 RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
89 /* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
92 #define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes)
94 typedef struct xl_xact_abort
97 int nrels; /* number of RelFileNodes */
98 int nsubxacts; /* number of subtransaction XIDs */
99 /* Array of RelFileNode(s) to drop at abort */
100 RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */
101 /* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */
104 #define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes)
107 * COMMIT_PREPARED and ABORT_PREPARED are identical to COMMIT/ABORT records
108 * except that we have to store the XID of the prepared transaction explicitly
109 * --- the XID in the record header will be for the transaction doing the
110 * COMMIT PREPARED or ABORT PREPARED command.
113 typedef struct xl_xact_commit_prepared
115 TransactionId xid; /* XID of prepared xact */
116 xl_xact_commit crec; /* COMMIT record */
117 /* MORE DATA FOLLOWS AT END OF STRUCT */
118 } xl_xact_commit_prepared;
120 #define MinSizeOfXactCommitPrepared offsetof(xl_xact_commit_prepared, crec.xnodes)
122 typedef struct xl_xact_abort_prepared
124 TransactionId xid; /* XID of prepared xact */
125 xl_xact_abort arec; /* ABORT record */
126 /* MORE DATA FOLLOWS AT END OF STRUCT */
127 } xl_xact_abort_prepared;
129 #define MinSizeOfXactAbortPrepared offsetof(xl_xact_abort_prepared, arec.xnodes)
136 extern bool IsTransactionState(void);
137 extern bool IsAbortedTransactionBlockState(void);
138 extern TransactionId GetTopTransactionId(void);
139 extern TransactionId GetCurrentTransactionId(void);
140 extern TransactionId GetCurrentTransactionIdIfAny(void);
141 extern SubTransactionId GetCurrentSubTransactionId(void);
142 extern CommandId GetCurrentCommandId(void);
143 extern TimestampTz GetCurrentTransactionStartTimestamp(void);
144 extern int GetCurrentTransactionNestLevel(void);
145 extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
146 extern void CommandCounterIncrement(void);
147 extern void StartTransactionCommand(void);
148 extern void CommitTransactionCommand(void);
149 extern void AbortCurrentTransaction(void);
150 extern void BeginTransactionBlock(void);
151 extern bool EndTransactionBlock(void);
152 extern bool PrepareTransactionBlock(char *gid);
153 extern void UserAbortTransactionBlock(void);
154 extern void ReleaseSavepoint(List *options);
155 extern void DefineSavepoint(char *name);
156 extern void RollbackToSavepoint(List *options);
157 extern void BeginInternalSubTransaction(char *name);
158 extern void ReleaseCurrentSubTransaction(void);
159 extern void RollbackAndReleaseCurrentSubTransaction(void);
160 extern bool IsSubTransaction(void);
161 extern bool IsTransactionBlock(void);
162 extern bool IsTransactionOrTransactionBlock(void);
163 extern char TransactionBlockStatusCode(void);
164 extern void AbortOutOfAnyTransaction(void);
165 extern void PreventTransactionChain(void *stmtNode, const char *stmtType);
166 extern void RequireTransactionChain(void *stmtNode, const char *stmtType);
167 extern bool IsInTransactionChain(void *stmtNode);
168 extern void RegisterXactCallback(XactCallback callback, void *arg);
169 extern void UnregisterXactCallback(XactCallback callback, void *arg);
170 extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);
171 extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);
173 extern void RecordTransactionCommit(void);
175 extern int xactGetCommittedChildren(TransactionId **ptr);
177 extern void xact_redo(XLogRecPtr lsn, XLogRecord *record);
178 extern void xact_desc(StringInfo buf, uint8 xl_info, char *rec);