xact.h 5.71 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * xact.h
4
 *	  postgres transaction system definitions
5 6
 *
 *
7
 * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
Bruce Momjian's avatar
Add:  
Bruce Momjian committed
8
 * Portions Copyright (c) 1994, Regents of the University of California
9
 *
10
 * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.85 2007/03/13 00:33:42 tgl Exp $
11 12 13 14 15 16
 *
 *-------------------------------------------------------------------------
 */
#ifndef XACT_H
#define XACT_H

17
#include "access/xlog.h"
18
#include "nodes/pg_list.h"
19
#include "storage/relfilenode.h"
20
#include "utils/timestamp.h"
21

22

23 24 25
/*
 * Xact isolation levels
 */
26
#define XACT_READ_UNCOMMITTED	0
27
#define XACT_READ_COMMITTED		1
28
#define XACT_REPEATABLE_READ	2
29 30 31 32
#define XACT_SERIALIZABLE		3

extern int	DefaultXactIsoLevel;
extern int	XactIsoLevel;
33

34
/*
35 36
 * We only implement two isolation levels internally.  This macro should
 * be used to check which one is selected.
37
 */
38
#define IsXactIsoLevelSerializable (XactIsoLevel >= XACT_REPEATABLE_READ)
39

40
/* Xact read-only state */
Bruce Momjian's avatar
Bruce Momjian committed
41 42
extern bool DefaultXactReadOnly;
extern bool XactReadOnly;
43

44
/*
45
 *	start- and end-of-transaction callbacks for dynamically loaded modules
46
 */
47 48 49
typedef enum
{
	XACT_EVENT_COMMIT,
50 51
	XACT_EVENT_ABORT,
	XACT_EVENT_PREPARE
52 53
} XactEvent;

54 55 56 57 58 59 60 61 62 63
typedef void (*XactCallback) (XactEvent event, void *arg);

typedef enum
{
	SUBXACT_EVENT_START_SUB,
	SUBXACT_EVENT_COMMIT_SUB,
	SUBXACT_EVENT_ABORT_SUB
} SubXactEvent;

typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
64
									SubTransactionId parentSubid, void *arg);
65

66

67 68 69
/* ----------------
 *		transaction-related XLOG entries
 * ----------------
70 71
 */

72 73 74 75
/*
 * XLOG allows to store some information in high 4 bits of log
 * record xl_info field
 */
76 77 78 79 80
#define XLOG_XACT_COMMIT			0x00
#define XLOG_XACT_PREPARE			0x10
#define XLOG_XACT_ABORT				0x20
#define XLOG_XACT_COMMIT_PREPARED	0x30
#define XLOG_XACT_ABORT_PREPARED	0x40
81 82 83 84

typedef struct xl_xact_commit
{
	time_t		xtime;
85 86
	int			nrels;			/* number of RelFileNodes */
	int			nsubxacts;		/* number of subtransaction XIDs */
87
	/* Array of RelFileNode(s) to drop at commit */
Bruce Momjian's avatar
Bruce Momjian committed
88
	RelFileNode xnodes[1];		/* VARIABLE LENGTH ARRAY */
89
	/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
90 91
} xl_xact_commit;

Bruce Momjian's avatar
Bruce Momjian committed
92
#define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes)
93 94 95 96

typedef struct xl_xact_abort
{
	time_t		xtime;
97 98
	int			nrels;			/* number of RelFileNodes */
	int			nsubxacts;		/* number of subtransaction XIDs */
99
	/* Array of RelFileNode(s) to drop at abort */
Bruce Momjian's avatar
Bruce Momjian committed
100
	RelFileNode xnodes[1];		/* VARIABLE LENGTH ARRAY */
101
	/* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */
102 103
} xl_xact_abort;

104 105
#define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes)

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/*
 * COMMIT_PREPARED and ABORT_PREPARED are identical to COMMIT/ABORT records
 * except that we have to store the XID of the prepared transaction explicitly
 * --- the XID in the record header will be for the transaction doing the
 * COMMIT PREPARED or ABORT PREPARED command.
 */

typedef struct xl_xact_commit_prepared
{
	TransactionId xid;			/* XID of prepared xact */
	xl_xact_commit crec;		/* COMMIT record */
	/* MORE DATA FOLLOWS AT END OF STRUCT */
} xl_xact_commit_prepared;

#define MinSizeOfXactCommitPrepared offsetof(xl_xact_commit_prepared, crec.xnodes)

typedef struct xl_xact_abort_prepared
{
	TransactionId xid;			/* XID of prepared xact */
	xl_xact_abort arec;			/* ABORT record */
	/* MORE DATA FOLLOWS AT END OF STRUCT */
} xl_xact_abort_prepared;

#define MinSizeOfXactAbortPrepared offsetof(xl_xact_abort_prepared, arec.xnodes)

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 141
extern TransactionId GetCurrentTransactionIdIfAny(void);
extern SubTransactionId GetCurrentSubTransactionId(void);
142
extern CommandId GetCurrentCommandId(void);
143
extern TimestampTz GetCurrentTransactionStartTimestamp(void);
144 145
extern TimestampTz GetCurrentStatementStartTimestamp(void);
extern void SetCurrentStatementStartTimestamp(void);
146
extern int	GetCurrentTransactionNestLevel(void);
147 148
extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
extern void CommandCounterIncrement(void);
149 150
extern void StartTransactionCommand(void);
extern void CommitTransactionCommand(void);
151 152
extern void AbortCurrentTransaction(void);
extern void BeginTransactionBlock(void);
153
extern bool EndTransactionBlock(void);
154
extern bool PrepareTransactionBlock(char *gid);
155 156 157 158
extern void UserAbortTransactionBlock(void);
extern void ReleaseSavepoint(List *options);
extern void DefineSavepoint(char *name);
extern void RollbackToSavepoint(List *options);
Tom Lane's avatar
Tom Lane committed
159 160 161
extern void BeginInternalSubTransaction(char *name);
extern void ReleaseCurrentSubTransaction(void);
extern void RollbackAndReleaseCurrentSubTransaction(void);
162
extern bool IsSubTransaction(void);
163
extern bool IsTransactionBlock(void);
164
extern bool IsTransactionOrTransactionBlock(void);
165
extern char TransactionBlockStatusCode(void);
166
extern void AbortOutOfAnyTransaction(void);
167 168 169
extern void PreventTransactionChain(bool isTopLevel, const char *stmtType);
extern void RequireTransactionChain(bool isTopLevel, const char *stmtType);
extern bool IsInTransactionChain(bool isTopLevel);
170 171
extern void RegisterXactCallback(XactCallback callback, void *arg);
extern void UnregisterXactCallback(XactCallback callback, void *arg);
172 173
extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);
extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);
174

Vadim B. Mikheev's avatar
WAL  
Vadim B. Mikheev committed
175 176
extern void RecordTransactionCommit(void);

177
extern int	xactGetCommittedChildren(TransactionId **ptr);
178

179
extern void xact_redo(XLogRecPtr lsn, XLogRecord *record);
180
extern void xact_desc(StringInfo buf, uint8 xl_info, char *rec);
181

182
#endif   /* XACT_H */