On Mon, Jun 10, 2019 at 4:10 PM Kuntal Ghosh <kuntalghosh.2...@gmail.com>
wrote:

> On Mon, Jun 10, 2019 at 1:30 PM Alex <zhihui.fan1...@gmail.com> wrote:
> >
> >
> >
> > On Mon, Jun 10, 2019 at 3:28 PM Kuntal Ghosh <kuntalghosh.2...@gmail.com>
> wrote:
> >>
> >> On Mon, Jun 10, 2019 at 12:15 PM Alex <zhihui.fan1...@gmail.com> wrote:
> >>>
> >>>  HEAPTUPLE_RECENTLY_DEAD, /* tuple is dead, but not deletable yet */
> >>>
> >>>  It is a tuple which has been deleted AND committed but before the
> delete there is a transaction started but not committed. Let call this
> transaction as Transaction A.
> >>>
> >>> if we create index on this time, Let's call this index as Index A, it
> still index this record.  my question is why need this.
> >>>
> >> In this case, the changes of the tuple is not visible yet. Now suppose,
> your transaction A is serializable and you've another serializable
> transaction B which can see the index A. It generates a plan that requires
> to fetch the deleted tuple through an index scan. If the tuple is not
> present in the index, how are you going to create a conflict edge between
> transaction A and transaction B?
> >>
> >> Basically, you need to identify the following clause to detect
> serializable conflicts:
> >> Transaction A precedes transaction B. (Because, transaction A has
> deleted a tuple and it's not visible to transaction B)
> >>
> >
> > thanks Ghosh.  Looks your answer is similar with my previous point
> (transaction is  serializable).   actually if the transaction B can't see
> the “deleted" which has been committed,  should it see the index A which is
> created after the "delete" transaction?
> >
> I think what I'm trying to say is different.
>
> For my case, the sequence is as following:
> 1. Transaction A has deleted a tuple, say t1 and got committed.
> 2. Index A has been created successfully.
> 3. Now, transaction B starts and use the index A to fetch the tuple
> t1. While doing visibility check, transaction B gets to know that t1
> has been deleted by a committed transaction A, so it can't see the
> tuple. But, it creates a dependency edge that transaction A precedes
> transaction B. This edge is required to detect a serializable conflict
> failure.
>
> If you don't create the index entry, it'll not be able to create that edge.
>

Thanks,  I got the difference now, but still not get the necessity of it.
1.   Assume we don't index it,  in which situation we can get a wrong
result?
2.   If we only support "Read Committed" isolation level,  is there a safe
way to not index such data?

-- 
> Thanks & Regards,
> Kuntal Ghosh
> EnterpriseDB: http://www.enterprisedb.com
>

Reply via email to