mirror of
https://github.com/postgres/postgres.git
synced 2025-05-28 00:03:23 -04:00
be part of multixacts, so allocate a slot for each prepared transaction in the "oldest member" array in multixact.c. On PREPARE TRANSACTION, transfer the oldest member value from the current backends slot to the prepared xact slot. Also save and recover the value from the 2pc state file. The symptom of the bug was that after a transaction prepared, a shared lock still held by the prepared transaction was sometimes ignored by other transactions. Fix back to 8.1, where both 2PC and multixact were introduced.
54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* twophase_rmgr.c
|
|
* Two-phase-commit resource managers tables
|
|
*
|
|
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $PostgreSQL: pgsql/src/backend/access/transam/twophase_rmgr.c,v 1.10 2009/11/23 09:58:36 heikki Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "access/multixact.h"
|
|
#include "access/twophase_rmgr.h"
|
|
#include "commands/async.h"
|
|
#include "pgstat.h"
|
|
#include "storage/lock.h"
|
|
#include "utils/inval.h"
|
|
|
|
|
|
const TwoPhaseCallback twophase_recover_callbacks[TWOPHASE_RM_MAX_ID + 1] =
|
|
{
|
|
NULL, /* END ID */
|
|
lock_twophase_recover, /* Lock */
|
|
NULL, /* Inval */
|
|
NULL, /* notify/listen */
|
|
NULL, /* pgstat */
|
|
multixact_twophase_recover /* MultiXact */
|
|
};
|
|
|
|
const TwoPhaseCallback twophase_postcommit_callbacks[TWOPHASE_RM_MAX_ID + 1] =
|
|
{
|
|
NULL, /* END ID */
|
|
lock_twophase_postcommit, /* Lock */
|
|
inval_twophase_postcommit, /* Inval */
|
|
notify_twophase_postcommit, /* notify/listen */
|
|
pgstat_twophase_postcommit, /* pgstat */
|
|
multixact_twophase_postcommit /* MultiXact */
|
|
};
|
|
|
|
const TwoPhaseCallback twophase_postabort_callbacks[TWOPHASE_RM_MAX_ID + 1] =
|
|
{
|
|
NULL, /* END ID */
|
|
lock_twophase_postabort, /* Lock */
|
|
NULL, /* Inval */
|
|
NULL, /* notify/listen */
|
|
pgstat_twophase_postabort, /* pgstat */
|
|
multixact_twophase_postabort /* MultiXact */
|
|
};
|