Hannu Krosing <hannu@tm.ee> writes:
> but then no xmax should ever be visible in a regular query :
Not so. For example, if a transaction tried to delete a tuple, but is
either still open or rolled back, then other transactions would see its
XID in the tuple's xmax. Also, SELECT FOR UPDATE uses xmax to record
the XID of the transaction that has the tuple locked --- that's the
case you are seeing, because of the SELECT FOR UPDATE done by the
foreign-key triggers on the table.
There is a claim in the current documentation that xmax is never nonzero
in a visible tuple, but that's incorrect ...
regards, tom lane