Well, we don't know what isolation level the OP is using.
We use the default. We do not explicitly set the isolation level.
We also don't know what PG version he's using.
it's 12.1
From memory, it hasn't been that long since we fixed things so that an idle read-committed transaction advertises no xmin. It's also possible that the transaction isn't really idle between statements (eg, if it's holding open cursors, or the like).