]> granicus.if.org Git - postgresql/blob - src/include/access/xact.h
da2455f68fdf467a616ca8c4785d52d11b1ea99f
[postgresql] / src / include / access / xact.h
1 /*-------------------------------------------------------------------------
2  *
3  * xact.h
4  *        postgres transaction system definitions
5  *
6  *
7  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.81 2006/03/24 04:32:13 tgl Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef XACT_H
15 #define XACT_H
16
17 #include "access/xlog.h"
18 #include "storage/relfilenode.h"
19 #include "nodes/pg_list.h"
20 #include "utils/timestamp.h"
21
22
23 /*
24  * Xact isolation levels
25  */
26 #define XACT_READ_UNCOMMITTED   0
27 #define XACT_READ_COMMITTED             1
28 #define XACT_REPEATABLE_READ    2
29 #define XACT_SERIALIZABLE               3
30
31 extern int      DefaultXactIsoLevel;
32 extern int      XactIsoLevel;
33
34 /*
35  * We only implement two isolation levels internally.  This macro should
36  * be used to check which one is selected.
37  */
38 #define IsXactIsoLevelSerializable (XactIsoLevel >= XACT_REPEATABLE_READ)
39
40 /* Xact read-only state */
41 extern bool DefaultXactReadOnly;
42 extern bool XactReadOnly;
43
44 /*
45  *      start- and end-of-transaction callbacks for dynamically loaded modules
46  */
47 typedef enum
48 {
49         XACT_EVENT_COMMIT,
50         XACT_EVENT_ABORT,
51         XACT_EVENT_PREPARE
52 } XactEvent;
53
54 typedef void (*XactCallback) (XactEvent event, void *arg);
55
56 typedef enum
57 {
58         SUBXACT_EVENT_START_SUB,
59         SUBXACT_EVENT_COMMIT_SUB,
60         SUBXACT_EVENT_ABORT_SUB
61 } SubXactEvent;
62
63 typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
64                                                                         SubTransactionId parentSubid, void *arg);
65
66
67 /* ----------------
68  *              transaction-related XLOG entries
69  * ----------------
70  */
71
72 /*
73  * XLOG allows to store some information in high 4 bits of log
74  * record xl_info field
75  */
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
81
82 typedef struct xl_xact_commit
83 {
84         time_t          xtime;
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 */
90 } xl_xact_commit;
91
92 #define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes)
93
94 typedef struct xl_xact_abort
95 {
96         time_t          xtime;
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 */
102 } xl_xact_abort;
103
104 #define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes)
105
106 /*
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.
111  */
112
113 typedef struct xl_xact_commit_prepared
114 {
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;
119
120 #define MinSizeOfXactCommitPrepared offsetof(xl_xact_commit_prepared, crec.xnodes)
121
122 typedef struct xl_xact_abort_prepared
123 {
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;
128
129 #define MinSizeOfXactAbortPrepared offsetof(xl_xact_abort_prepared, arec.xnodes)
130
131
132 /* ----------------
133  *              extern definitions
134  * ----------------
135  */
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);
172
173 extern void RecordTransactionCommit(void);
174
175 extern int      xactGetCommittedChildren(TransactionId **ptr);
176
177 extern void xact_redo(XLogRecPtr lsn, XLogRecord *record);
178 extern void xact_desc(StringInfo buf, uint8 xl_info, char *rec);
179
180 #endif   /* XACT_H */