aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/heap/heapam.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 06db65d76f9..17950d482c1 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -1917,6 +1917,18 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
heaptup = tup;
/*
+ * We're about to do the actual insert -- but check for conflict first,
+ * to avoid possibly having to roll back work we've just done.
+ *
+ * For a heap insert, we only need to check for table-level SSI locks.
+ * Our new tuple can't possibly conflict with existing tuple locks, and
+ * heap page locks are only consolidated versions of tuple locks; they do
+ * not lock "gaps" as index page locks do. So we don't need to identify
+ * a buffer before making the call.
+ */
+ CheckForSerializableConflictIn(relation, NULL, InvalidBuffer);
+
+ /*
* Find buffer to insert this tuple into. If the page is all visible,
* this will also pin the requisite visibility map page.
*/
@@ -1924,13 +1936,6 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
InvalidBuffer, options, bistate,
&vmbuffer, NULL);
- /*
- * We're about to do the actual insert -- check for conflict at the
- * relation or buffer level first, to avoid possibly having to roll back
- * work we've just done.
- */
- CheckForSerializableConflictIn(relation, NULL, buffer);
-
/* NO EREPORT(ERROR) from here till changes are logged */
START_CRIT_SECTION();