diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-07-16 22:43:34 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-07-16 22:43:34 +0000 |
commit | ed5c4e4a14e9f9f4b818521b943bace0d5cd1e01 (patch) | |
tree | 5604b1a45b9f52df7e6d278a6b88f38b1dbfb633 /src/backend/access/transam/varsup.c | |
parent | ffbd97c8ac4bb9ebfdc63e4b2156c2b263dd0786 (diff) |
Improve documentation about reasoning behind the order of operations
in GetSnapshotData, GetNewTransactionId, CommitTransaction, AbortTransaction,
etc. Correct race condition in transaction status testing in
HeapTupleSatisfiesVacuum --- this wasn't important for old VACUUM with
exclusive lock on its table, but it sure is important now. All per
pghackers discussion 7/11/01 and 7/12/01.
Diffstat (limited to 'src/backend/access/transam/varsup.c')
-rw-r--r-- | src/backend/access/transam/varsup.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index 2b253fc5855..857f2c3d3e8 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -6,7 +6,7 @@ * Copyright (c) 2000, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.41 2001/07/12 04:11:13 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.42 2001/07/16 22:43:33 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -60,8 +60,16 @@ GetNewTransactionId(TransactionId *xid) * XXX by storing xid into MyProc without acquiring SInvalLock, we are * relying on fetch/store of an xid to be atomic, else other backends * might see a partially-set xid here. But holding both locks at once - * would be a nasty concurrency hit (and at this writing, could cause a - * deadlock against GetSnapshotData). So for now, assume atomicity. + * would be a nasty concurrency hit (and in fact could cause a deadlock + * against GetSnapshotData). So for now, assume atomicity. Note that + * readers of PROC xid field should be careful to fetch the value only + * once, rather than assume they can read it multiple times and get the + * same answer each time. + * + * A solution to the atomic-store problem would be to give each PROC + * its own spinlock used only for fetching/storing that PROC's xid. + * (SInvalLock would then mean primarily that PROCs couldn't be added/ + * removed while holding the lock.) */ if (MyProc != (PROC *) NULL) MyProc->xid = *xid; |