* GUC system resets the characteristics at transaction end, so for example
* just skipping the reset in StartTransaction() won't work.)
*/
-static int save_XactIsoLevel;
-static bool save_XactReadOnly;
-static bool save_XactDeferrable;
-
void
-SaveTransactionCharacteristics(void)
+SaveTransactionCharacteristics(SavedTransactionCharacteristics *s)
{
- save_XactIsoLevel = XactIsoLevel;
- save_XactReadOnly = XactReadOnly;
- save_XactDeferrable = XactDeferrable;
+ s->save_XactIsoLevel = XactIsoLevel;
+ s->save_XactReadOnly = XactReadOnly;
+ s->save_XactDeferrable = XactDeferrable;
}
void
-RestoreTransactionCharacteristics(void)
+RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s)
{
- XactIsoLevel = save_XactIsoLevel;
- XactReadOnly = save_XactReadOnly;
- XactDeferrable = save_XactDeferrable;
+ XactIsoLevel = s->save_XactIsoLevel;
+ XactReadOnly = s->save_XactReadOnly;
+ XactDeferrable = s->save_XactDeferrable;
}
CommitTransactionCommand(void)
{
TransactionState s = CurrentTransactionState;
+ SavedTransactionCharacteristics savetc;
- if (s->chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
switch (s->blockState)
{
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
}
else if (s->blockState == TBLOCK_PREPARE)
_SPI_commit(bool chain)
{
MemoryContext oldcontext = CurrentMemoryContext;
+ SavedTransactionCharacteristics savetc;
/*
* Complain if we are in a context that doesn't permit transaction
(errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
errmsg("cannot commit while a subtransaction is active")));
- /* XXX this ain't re-entrant enough for my taste */
if (chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
/* Catch any error occurring during the COMMIT */
PG_TRY();
/* Immediately start a new transaction */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
/* ... and start a new one */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
_SPI_rollback(bool chain)
{
MemoryContext oldcontext = CurrentMemoryContext;
+ SavedTransactionCharacteristics savetc;
/* see under SPI_commit() */
if (_SPI_current->atomic)
(errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
errmsg("cannot roll back while a subtransaction is active")));
- /* XXX this ain't re-entrant enough for my taste */
if (chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
/* Catch any error occurring during the ROLLBACK */
PG_TRY();
/* Immediately start a new transaction */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
/* ... and start a new one */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
SubTransactionId parentSubid, void *arg);
+/* Data structure for Save/RestoreTransactionCharacteristics */
+typedef struct SavedTransactionCharacteristics
+{
+ int save_XactIsoLevel;
+ bool save_XactReadOnly;
+ bool save_XactDeferrable;
+} SavedTransactionCharacteristics;
+
/* ----------------
* transaction-related XLOG entries
extern void CommandCounterIncrement(void);
extern void ForceSyncCommit(void);
extern void StartTransactionCommand(void);
-extern void SaveTransactionCharacteristics(void);
-extern void RestoreTransactionCharacteristics(void);
+extern void SaveTransactionCharacteristics(SavedTransactionCharacteristics *s);
+extern void RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s);
extern void CommitTransactionCommand(void);
extern void AbortCurrentTransaction(void);
extern void BeginTransactionBlock(void);