summaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xact.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r--src/backend/access/transam/xact.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 6884e635904..6bde05733ac 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.38 1999/06/03 04:41:41 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.39 1999/06/03 13:33:12 vadim Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
@@ -646,18 +646,6 @@ RecordTransactionCommit()
FlushBufferPool(!TransactionFlushEnabled());
if (leak)
ResetBufferPool();
-
- /*
- * Let others know about no transaction in progress.
- * Note that this must be done _before_ releasing locks
- * we hold or bad (too high) XmaxRecent value might be
- * used by vacuum.
- */
- if (MyProc != (PROC *) NULL)
- {
- MyProc->xid = InvalidTransactionId;
- MyProc->xmin = InvalidTransactionId;
- }
}
@@ -950,6 +938,28 @@ CommitTransaction()
DestroyNoNameRels();
AtEOXact_portals();
RecordTransactionCommit();
+
+ /*
+ * Let others know about no transaction in progress by me.
+ * Note that this must be done _before_ releasing locks we hold
+ * and SpinAcquire(ShmemIndexLock) is required - or bad (too high)
+ * XmaxRecent value might be used by vacuum: UPDATE with xid 0 is
+ * blocked by xid 1' UPDATE, xid 1 is doing commit while xid 2
+ * gets snapshot - if xid 2' GetSnapshotData sees xid 1 as running
+ * then it must see xid 0 as running as well or XmaxRecent = 1
+ * might be used by concurrent vacuum causing
+ * ERROR: Child itemid marked as unused
+ * This bug was reported by Hiroshi Inoue and I was able to reproduce
+ * it with 3 sessions and gdb. - vadim 06/03/99
+ */
+ if (MyProc != (PROC *) NULL)
+ {
+ SpinAcquire(ShmemIndexLock);
+ MyProc->xid = InvalidTransactionId;
+ MyProc->xmin = InvalidTransactionId;
+ SpinRelease(ShmemIndexLock);
+ }
+
RelationPurgeLocalRelation(true);
AtCommit_Cache();
AtCommit_Locks();