Hi,
On 2019-01-02 16:02:21 +0100, Peter Eisentraut wrote:
> +++ b/src/backend/access/transam/xact.c
> @@ -189,6 +189,7 @@ typedef struct TransactionStateData
> bool startedInRecovery; /* did we start in recovery? */
> bool didLogXid; /* has xid been included in WAL record? */
> int parallelModeLevel; /* Enter/ExitParallelMode counter */
> + bool chain; /* start a new block after this one */
> struct TransactionStateData *parent; /* back link to parent */
> } TransactionStateData;
>
> @@ -2760,6 +2761,36 @@ StartTransactionCommand(void)
> MemoryContextSwitchTo(CurTransactionContext);
> }
>
> +
> +/*
> + * Simple system for saving and restoring transaction characteristics
> + * (isolation level, read only, deferrable). We need this for transaction
> + * chaining, so that we can set the characteristics of the new transaction to
> + * be the same as the previous one. (We need something like this because the
> + * 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;
We normally don't define variables in the middle of a file? Also, why
do these need to be global vars rather than defined where we do
chaining? I'm imagining a SavedTransactionState struct declared on the
stack that's then passed to Save/Restore?
Not crucial, but I do wonder if we can come up with a prettier approach
for this.
Greetings,
Andres Freund