chenhj <chjis...@163.com> writes: > When execute sql with prepared protocol, read committed transaction will hold > backend_xmin until the end of the transaction.
No, just till the active portal is dropped. In the case you show, the issue is that libpq doesn't bother to issue an explicit Close Portal message, but just lets the unnamed portal get recycled implicitly by the next query (cf. PQsendQueryGuts). So the portal stays open, and its snapshot stays alive, till some other command is sent. This is different from the behavior for simple query mode, where the portal is automatically closed after execution. I agree this isn't very desirable now that we have mechanisms to advance the advertised xmin as soon as snapshots go away. Perhaps portals could be taught to drop their snapshots as soon as the query has reached completion, but it'd be a little bit ticklish to not break valid use-patterns for cursors. Another idea would be to fix it on the client side by including an explicit Close command in the PQsendQuery sequence. But if there are similar usage patterns in other client libraries, it might take a long time to get them all up to speed. regards, tom lane