blob: 7576da8c651b4b16f57f794f71d4af01f8ae6f0d [file] [log] [blame]
/*-------------------------------------------------------------------------
*
* xact.h
* postgres transaction system definitions
*
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.83 2006/07/11 18:26:11 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef XACT_H
#define XACT_H
#include "access/xlog.h"
#include "nodes/pg_list.h"
#include "storage/relfilenode.h"
#include "utils/timestamp.h"
#include "access/persistentendxactrec.h"
#include "cdb/cdbpublic.h"
/*
* Xact isolation levels
*/
#define XACT_READ_UNCOMMITTED 0
#define XACT_READ_COMMITTED 1
#define XACT_REPEATABLE_READ 2
#define XACT_SERIALIZABLE 3
extern int DefaultXactIsoLevel;
extern int XactIsoLevel;
/*
* We only implement two isolation levels internally. This macro should
* be used to check which one is selected.
*/
#define IsXactIsoLevelSerializable (XactIsoLevel >= XACT_REPEATABLE_READ)
/* Xact read-only state */
extern bool DefaultXactReadOnly;
extern bool XactReadOnly;
/*
* start- and end-of-transaction callbacks for dynamically loaded modules
*/
typedef enum
{
XACT_EVENT_COMMIT,
XACT_EVENT_ABORT,
XACT_EVENT_PREPARE
} XactEvent;
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,
SubTransactionId parentSubid, void *arg);
/* ----------------
* transaction-related XLOG entries
* ----------------
*/
/*
* XLOG allows to store some information in high 4 bits of log
* record xl_info field
*/
#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
typedef struct xl_xact_commit
{
time_t xtime;
int16 persistentCommitObjectCount;
/* number of PersistentEndXactRec style objects */
int nsubxacts; /* number of subtransaction XIDs */
/* PersistentEndXactRec style objects for commit */
uint8 data[0]; /* VARIABLE LENGTH ARRAY */
/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
} xl_xact_commit;
#define MinSizeOfXactCommit offsetof(xl_xact_commit, data)
typedef struct xl_xact_abort
{
time_t xtime;
int16 persistentAbortObjectCount;
/* number of PersistentEndXactRec style objects */
int nsubxacts; /* number of subtransaction XIDs */
/* PersistentEndXactRec style objects for abort */
uint8 data[0]; /* VARIABLE LENGTH ARRAY */
/* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
} xl_xact_abort;
#define MinSizeOfXactAbort offsetof(xl_xact_abort, data)
/*
* 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.data)
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.data)
/*
* xl_xact_distributed_forget - moved to cdb/cdbtm.h
*/
typedef struct xl_xact_distributed_forget
{
TMGXACT_LOG gxact_log;
} xl_xact_distributed_forget;
/*
* Maximum number of subtransactions per transaction allowed under MPP until
* we can move away from a static length SharedSnapshot structure.
*/
#define MaxGpSavePoints 100
typedef enum
{
XACT_INFOKIND_NONE = 0,
XACT_INFOKIND_COMMIT,
XACT_INFOKIND_ABORT,
XACT_INFOKIND_PREPARE
} XactInfoKind;
typedef struct XidBuffer
{
uint32 max_bufs;
uint32 actual_bufs;
uint32 last_buf_cnt;
TransactionId **ids_buf;
} XidBuffer;
extern XidBuffer subxbuf;
extern File subxip_file;
/* ----------------
* extern definitions
* ----------------
*/
/* Greenplum Database specific */
extern char *XactInfoKind_Name(
const XactInfoKind kind);
extern void SetSharedTransactionId(void);
extern void SetSharedTransactionId_reader(TransactionId xid, CommandId cid);
extern void SetXactSeqXlog(void);
extern bool IsTransactionState(void);
extern bool IsAbortInProgress(void);
extern bool IsCommitInProgress(void);
extern bool IsAbortedTransactionBlockState(void);
extern void GetAllTransactionXids(
DistributedTransactionId *distribXid,
TransactionId *localXid,
TransactionId *subXid);
extern TransactionId GetTopTransactionId(void);
extern TransactionId GetCurrentTransactionId(void);
extern TransactionId GetCurrentTransactionIdIfAny(void);
extern SubTransactionId GetCurrentSubTransactionId(void);
extern CommandId GetCurrentCommandId(void);
extern TimestampTz GetCurrentTransactionStartTimestamp(void);
extern TimestampTz GetCurrentStatementStartTimestamp(void);
extern TimestampTz GetCurrentTransactionStopTimestamp(void);
extern void SetCurrentStatementStartTimestamp(void);
extern void SetCurrentStatementStartTimestampToMaster(TimestampTz masterTime);
extern int GetCurrentTransactionNestLevel(void);
extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
extern void CommandCounterIncrement(void);
extern void StartTransactionCommand(void);
extern void CommitTransactionCommand(void);
extern void AbortCurrentTransaction(void);
extern void BeginTransactionBlock(void);
extern bool EndTransactionBlock(void);
extern bool PrepareTransactionBlock(char *gid);
extern void UserAbortTransactionBlock(void);
extern void ReleaseSavepoint(List *options);
extern void DefineSavepoint(char *name);
extern void DefineDispatchSavepoint(char *name);
extern void RollbackToSavepoint(List *options);
extern void BeginInternalSubTransaction(char *name);
extern void ReleaseCurrentSubTransaction(void);
extern void RollbackAndReleaseCurrentSubTransaction(void);
extern void TransactionInformationQEWriter(DistributedTransactionId *QEDistributedTransactionId, CommandId *QECommandId, bool *QEDirty);
extern bool IsSubTransaction(void);
extern bool IsTransactionBlock(void);
extern bool IsTransactionOrTransactionBlock(void);
extern bool IsTransactionDirty(void);
extern void ExecutorMarkTransactionUsesSequences(void);
extern void ExecutorMarkTransactionDoesWrites(void);
extern bool ExecutorSaysTransactionDoesWrites(void);
extern char TransactionBlockStatusCode(void);
extern void AbortOutOfAnyTransaction(void);
extern void PreventTransactionChain(void *stmtNode, const char *stmtType);
extern void RequireTransactionChain(void *stmtNode, const char *stmtType);
extern bool IsInTransactionChain(void *stmtNode);
extern void RegisterXactCallback(XactCallback callback, void *arg);
extern void UnregisterXactCallback(XactCallback callback, void *arg);
extern void RegisterXactCallbackOnce(XactCallback callback, void *arg);
extern void UnregisterXactCallbackOnce(XactCallback callback, void *arg);
extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);
extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);
extern void RecordTransactionCommit(void);
extern bool RecordCrashTransactionAbortRecord(
TransactionId xid,
PersistentEndXactRecObjects *persistentAbortObjects);
extern int xactGetCommittedChildren(TransactionId **ptr);
extern void xact_redo(XLogRecPtr beginLoc, XLogRecPtr lsn, XLogRecord *record);
extern bool xact_redo_get_info(
XLogRecord *record,
XactInfoKind *infoKind,
TransactionId *xid,
PersistentEndXactRecObjects *persistentObjects,
TransactionId **subXids,
int *subXidCount);
extern void xact_desc(StringInfo buf, XLogRecPtr beginLoc, XLogRecord *record);
extern const char *IsoLevelAsUpperString(int IsoLevel);
#ifdef WATCH_VISIBILITY_IN_ACTION
extern char* WatchCurrentTransactionString(void);
#endif
extern bool FindXidInXidBuffer(XidBuffer *xidbuf,
TransactionId xid, uint32 *cnt, int32 *index);
extern void AddSortedToXidBuffer(XidBuffer *xidbuf, TransactionId *xids,
uint32 cnt);
extern void ResetXidBuffer(XidBuffer *xidbuf);
#endif /* XACT_H */