Re: Tuples inserted and deleted by the same transaction

From: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
To: Nikita Malakhov <hukutoc(at)gmail(dot)com>
Cc: pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Tuples inserted and deleted by the same transaction
Date: 2022-09-13 10:04:04
Message-ID: 2e215df8b26d665fa7152157707c0e5afd0db02e.camel@cybertec.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, 2022-09-13 at 11:47 +0300, Nikita Malakhov wrote:
> On Tue, Sep 13, 2022 at 11:06 AM Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at> wrote:
> > Shouldn't such tuples be considered dead right away, even if the inserting
> > transaction is still active?  That would allow cleaning them up even before
> > the transaction is done.
> >
> > There is this code in HeapTupleSatisfiesVacuumHorizon:
> >
> >         else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple)))
> >         {
> >             [...]
> >             /* inserted and then deleted by same xact */
> >             if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tuple)))
> >                 return HEAPTUPLE_DELETE_IN_PROGRESS;
> >
> > Why HEAPTUPLE_DELETE_IN_PROGRESS and not HEAPTUPLE_DEAD?
>
> Please correct me if I'm wrong, despite tuples being inserted and deleted by the same
> transaction - they are visible inside the transaction and usable by it, so considering them
> dead and cleaning up during execution is a bad idea until the transaction is ended.

But once they are deleted or updated, even the transaction that created them cannot
see them any more, right?

Yours,
Laurenz Albe

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2022-09-13 10:07:40 Re: pgsql: Prefetch data referenced by the WAL, take II.
Previous Message Alvaro Herrera 2022-09-13 10:01:47 Re: [PATCH v1] fix potential memory leak in untransformRelOptions