]> granicus.if.org Git - postgresql/commitdiff
1. MyProc->xid assignment is moved to GetNewTransactionId so newer
authorVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 3 Jun 1999 04:41:41 +0000 (04:41 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 3 Jun 1999 04:41:41 +0000 (04:41 +0000)
   transactions will not assume that MyProc transaction was committed
   before snapshot calculations. With old MyProc->xid assignment
   (in xact.c:StartTransaction()) there was ability to see the same
   row twice (I used gdb for this)!...
2. Assignments of InvalidTransactionId to MyProc->xid and MyProc->xmin
   are moved from xact.c:CommitTransaction() to
   xact.c:RecordTransactionCommit() - this invalidation must be done
   before releasing transaction locks or bad (too high) XmaxRecent value
   might be used by vacuum ("ERROR:  Child itemid marked as unused"
   reported by "Hiroshi Inoue" <Inoue@tpf.co.jp>; once again, gdb
   allowed me reproduce this error).

src/backend/access/transam/varsup.c
src/backend/access/transam/xact.c

index 4bcc55bb92c7e4ed1cad72a3d87b386036700b54..fd23de1d98463810ef4614ff08696cbeef0e8ced 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.20 1999/05/25 16:07:48 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.21 1999/06/03 04:41:40 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,6 +19,7 @@
 #include <access/xact.h>
 #include <access/heapam.h>
 #include <catalog/catname.h>
+#include <storage/proc.h>
 
 static void GetNewObjectIdBlock(Oid *oid_return, int oid_block_size);
 static void VariableRelationGetNextOid(Oid *oid_return);
@@ -308,6 +309,9 @@ GetNewTransactionId(TransactionId *xid)
        TransactionIdAdd(&(ShmemVariableCache->nextXid), 1);
        (ShmemVariableCache->xid_count)--;
 
+       if (MyProc != (PROC *) NULL)
+               MyProc->xid = *xid;
+
        SpinRelease(OidGenLockId);
 }
 
index 8453d8688c2c4036b77966457450554bf017fa8d..6884e635904fce8e6d174c7797d476763e321b72 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.37 1999/05/31 22:53:59 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.38 1999/06/03 04:41:41 vadim Exp $
  *
  * NOTES
  *             Transaction aborts can now occur two ways:
@@ -646,6 +646,18 @@ 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;
+       }
 }
 
 
@@ -884,13 +896,6 @@ StartTransaction()
         */
        s->state = TRANS_INPROGRESS;
 
-       /*
-        * Let others to know about current transaction is in progress - vadim
-        * 11/26/96
-        */
-       if (MyProc != (PROC *) NULL)
-               MyProc->xid = s->transactionIdData;
-
 }
 
 /* ---------------
@@ -958,15 +963,6 @@ CommitTransaction()
         */
        s->state = TRANS_DEFAULT;
 
-       /*
-        * Let others to know about no transaction in progress - vadim
-        * 11/26/96
-        */
-       if (MyProc != (PROC *) NULL)
-       {
-               MyProc->xid = InvalidTransactionId;
-               MyProc->xmin = InvalidTransactionId;
-       }
 }
 
 /* --------------------------------