aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/transam.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/transam.c')
-rw-r--r--src/backend/access/transam/transam.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/src/backend/access/transam/transam.c b/src/backend/access/transam/transam.c
index 34d281de587..2a32960f9e3 100644
--- a/src/backend/access/transam/transam.c
+++ b/src/backend/access/transam/transam.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/transam/transam.c,v 1.57 2004/07/01 00:49:42 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/transam.c,v 1.58 2004/08/22 02:41:57 tgl Exp $
*
* NOTES
* This file contains the high level access-method interface to the
@@ -22,6 +22,7 @@
#include "access/clog.h"
#include "access/subtrans.h"
#include "access/transam.h"
+#include "utils/tqual.h"
/* ----------------
@@ -199,11 +200,15 @@ TransactionIdDidCommit(TransactionId transactionId)
/*
* If it's marked subcommitted, we have to check the parent recursively.
+ * However, if it's older than RecentXmin, we can't look at pg_subtrans;
+ * instead assume that the parent crashed without cleaning up its children.
*/
if (xidstatus == TRANSACTION_STATUS_SUB_COMMITTED)
{
TransactionId parentXid;
-
+
+ if (TransactionIdPrecedes(transactionId, RecentXmin))
+ return false;
parentXid = SubTransGetParent(transactionId);
Assert(TransactionIdIsValid(parentXid));
return TransactionIdDidCommit(parentXid);
@@ -243,24 +248,17 @@ TransactionIdDidAbort(TransactionId transactionId)
/*
* If it's marked subcommitted, we have to check the parent recursively.
- *
- * If we detect that the parent has aborted, update pg_clog to show the
- * subtransaction as aborted. This is only needed when the parent
- * crashed before either committing or aborting. We want to clean up
- * pg_clog so future visitors don't need to make this check again.
+ * However, if it's older than RecentXmin, we can't look at pg_subtrans;
+ * instead assume that the parent crashed without cleaning up its children.
*/
if (xidstatus == TRANSACTION_STATUS_SUB_COMMITTED)
{
TransactionId parentXid;
- bool parentAborted;
-
- parentXid = SubTransGetParent(transactionId);
- parentAborted = TransactionIdDidAbort(parentXid);
- if (parentAborted)
- TransactionIdAbort(transactionId);
-
- return parentAborted;
+ if (TransactionIdPrecedes(transactionId, RecentXmin))
+ return true;
+ parentXid = SubTransGetParent(transactionId);
+ return TransactionIdDidAbort(parentXid);
}
/*