postgres.git / summary / log / commit / refs

commit    2e44770fa39051f404f7d94fed557b359b1dba3c
Author:   Robert Haas <rhaas@postgresql.org>
Date:     Mon Jul 22 20:01:17 2013 +0000

    pgrowlocks: Use GetActiveSnapshot() rather than SnapshotNow.
    
    Per discussion, it's desirable to eliminate all remaining uses of
    SnapshotNow, because it has unpleasant semantics: race conditions
    can result in seeing multiple versions of a concurrently updated
    row, or none at all.  By using GetActiveSnapshot() here, callers
    will see exactly those rows that would have been visible if the
    invoking query had scanned the table using, for example, a SELECT
    statement.
    
    This is slightly different from the old behavior, because commits
    that happen concurrently with the scan will not affect the results.
    In REPEATABLE READ or SERIALIZABLE modes, where transaction
    snapshots are used, commits that have happened since the start of
    the transaction will also not affect the results.  It is hoped
    that this minor incompatibility will be thought an improvement,
    or at least no worse than what we did before.


contrib/pgrowlocks/pgrowlocks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index 8d8e78ea4aa..636ff056706 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -35,6 +35,7 @@ #include "utils/acl.h" #include "utils/builtins.h" #include "utils/rel.h" +#include "utils/snapmgr.h" #include "utils/tqual.h" @@ -106,7 +107,7 @@ pgrowlocks(PG_FUNCTION_ARGS) aclcheck_error(aclresult, ACL_KIND_CLASS, RelationGetRelationName(rel)); - scan = heap_beginscan(rel, SnapshotNow, 0, NULL); + scan = heap_beginscan(rel, GetActiveSnapshot(), 0, NULL); mydata = palloc(sizeof(*mydata)); mydata->rel = rel; mydata->scan = scan; [parent: f40a318eeaed]