mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Two-phase commit. Original patch by Heikki Linnakangas, with additional
hacking by Alvaro Herrera and Tom Lane.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.448 2005/06/14 21:04:40 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.449 2005/06/17 22:32:46 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* this is the "main" module of the postgres backend and
|
||||
@@ -930,6 +930,7 @@ exec_simple_query(const char *query_string)
|
||||
TransactionStmt *stmt = (TransactionStmt *) parsetree;
|
||||
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_PREPARE ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
allowit = true;
|
||||
@@ -1261,6 +1262,7 @@ exec_parse_message(const char *query_string, /* string to execute */
|
||||
TransactionStmt *stmt = (TransactionStmt *) parsetree;
|
||||
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_PREPARE ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
allowit = true;
|
||||
@@ -1751,6 +1753,7 @@ exec_execute_message(const char *portal_name, long max_rows)
|
||||
|
||||
is_trans_stmt = true;
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_PREPARE ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
is_trans_exit = true;
|
||||
|
||||
@@ -10,13 +10,14 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.236 2005/04/28 21:47:15 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.237 2005/06/17 22:32:46 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "access/twophase.h"
|
||||
#include "catalog/catalog.h"
|
||||
#include "catalog/namespace.h"
|
||||
#include "catalog/pg_shadow.h"
|
||||
@@ -383,11 +384,11 @@ ProcessUtility(Node *parsetree,
|
||||
if (strcmp(item->defname, "transaction_isolation") == 0)
|
||||
SetPGVariable("transaction_isolation",
|
||||
list_make1(item->arg),
|
||||
false);
|
||||
true);
|
||||
else if (strcmp(item->defname, "transaction_read_only") == 0)
|
||||
SetPGVariable("transaction_read_only",
|
||||
list_make1(item->arg),
|
||||
false);
|
||||
true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -401,6 +402,25 @@ ProcessUtility(Node *parsetree,
|
||||
}
|
||||
break;
|
||||
|
||||
case TRANS_STMT_PREPARE:
|
||||
if (!PrepareTransactionBlock(stmt->gid))
|
||||
{
|
||||
/* report unsuccessful commit in completionTag */
|
||||
if (completionTag)
|
||||
strcpy(completionTag, "ROLLBACK");
|
||||
}
|
||||
break;
|
||||
|
||||
case TRANS_STMT_COMMIT_PREPARED:
|
||||
PreventTransactionChain(stmt, "COMMIT PREPARED");
|
||||
FinishPreparedTransaction(stmt->gid, true);
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK_PREPARED:
|
||||
PreventTransactionChain(stmt, "ROLLBACK PREPARED");
|
||||
FinishPreparedTransaction(stmt->gid, false);
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK:
|
||||
UserAbortTransactionBlock();
|
||||
break;
|
||||
@@ -1215,6 +1235,18 @@ CreateCommandTag(Node *parsetree)
|
||||
tag = "RELEASE";
|
||||
break;
|
||||
|
||||
case TRANS_STMT_PREPARE:
|
||||
tag = "PREPARE TRANSACTION";
|
||||
break;
|
||||
|
||||
case TRANS_STMT_COMMIT_PREPARED:
|
||||
tag = "COMMIT PREPARED";
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK_PREPARED:
|
||||
tag = "ROLLBACK PREPARED";
|
||||
break;
|
||||
|
||||
default:
|
||||
tag = "???";
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user