aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2013-07-22 16:01:17 -0400
committerRobert Haas <rhaas@postgresql.org>2013-07-22 16:21:14 -0400
commit2e44770fa39051f404f7d94fed557b359b1dba3c (patch)
treeb499280d84cc7cf2015537ed405c06f158927cf0
parentf40a318eeaed0c66fcb2ddd442006e54bf49c634 (diff)
downloadpostgresql-2e44770fa39051f404f7d94fed557b359b1dba3c.tar.gz
postgresql-2e44770fa39051f404f7d94fed557b359b1dba3c.zip
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.
-rw-r--r--contrib/pgrowlocks/pgrowlocks.c3
1 files changed, 2 insertions, 1 deletions
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;