When POSTGRESQL updates a row, it keeps the old copy of the row in the table file and writes a new one. The old row is marked as expired, and used by other transactions still viewing the database in its prior state. Deletions are similarly marked as expired, but not removed from the table file.
If the b-tree changes for the transaction, would it not become broken for other transactions?
Can anyone tell me how Postgres handles this? Thank you, Luby