1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Allow default transaction isolation level (a.k.a. set session

characteristics) to be set through GUC.
This commit is contained in:
Peter Eisentraut
2001-06-30 22:03:26 +00:00
parent e4a40cc353
commit 10e9cd2299
6 changed files with 79 additions and 87 deletions

View File

@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.50 2001/06/12 22:54:05 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.51 2001/06/30 22:03:25 petere Exp $
*
*-------------------------------------------------------------------------
*/
@ -46,9 +46,6 @@ static bool show_timezone(void);
static bool reset_timezone(void);
static bool parse_timezone(char *);
static bool show_DefaultXactIsoLevel(void);
static bool reset_DefaultXactIsoLevel(void);
static bool parse_DefaultXactIsoLevel(char *);
static bool show_XactIsoLevel(void);
static bool reset_XactIsoLevel(void);
static bool parse_XactIsoLevel(char *);
@ -448,69 +445,6 @@ reset_timezone(void)
/* SET TRANSACTION */
static bool
parse_DefaultXactIsoLevel(char *value)
{
#if 0
TransactionState s = CurrentTransactionState;
#endif
if (value == NULL)
{
reset_DefaultXactIsoLevel();
return TRUE;
}
#if 0
if (s->state != TRANS_DEFAULT)
{
elog(ERROR, "ALTER SESSION/SET TRANSACTION ISOLATION LEVEL"
" can not be called within a transaction");
return TRUE;
}
#endif
if (strcasecmp(value, "SERIALIZABLE") == 0)
DefaultXactIsoLevel = XACT_SERIALIZABLE;
else if (strcasecmp(value, "COMMITTED") == 0)
DefaultXactIsoLevel = XACT_READ_COMMITTED;
else
elog(ERROR, "Bad TRANSACTION ISOLATION LEVEL (%s)", value);
return TRUE;
}
static bool
show_DefaultXactIsoLevel(void)
{
if (DefaultXactIsoLevel == XACT_SERIALIZABLE)
elog(NOTICE, "Default TRANSACTION ISOLATION LEVEL is SERIALIZABLE");
else
elog(NOTICE, "Default TRANSACTION ISOLATION LEVEL is READ COMMITTED");
return TRUE;
}
static bool
reset_DefaultXactIsoLevel(void)
{
#if 0
TransactionState s = CurrentTransactionState;
if (s->state != TRANS_DEFAULT)
{
elog(ERROR, "ALTER SESSION/SET TRANSACTION ISOLATION LEVEL"
" can not be called within a transaction");
return TRUE;
}
#endif
DefaultXactIsoLevel = XACT_READ_COMMITTED;
return TRUE;
}
static bool
parse_XactIsoLevel(char *value)
{
@ -530,7 +464,7 @@ parse_XactIsoLevel(char *value)
if (strcasecmp(value, "SERIALIZABLE") == 0)
XactIsoLevel = XACT_SERIALIZABLE;
else if (strcasecmp(value, "COMMITTED") == 0)
else if (strcasecmp(value, "READ COMMITTED") == 0)
XactIsoLevel = XACT_READ_COMMITTED;
else
elog(ERROR, "Bad TRANSACTION ISOLATION LEVEL (%s)", value);
@ -711,8 +645,6 @@ SetPGVariable(const char *name, const char *value)
parse_datestyle(mvalue);
else if (strcasecmp(name, "timezone") == 0)
parse_timezone(mvalue);
else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
parse_DefaultXactIsoLevel(mvalue);
else if (strcasecmp(name, "XactIsoLevel") == 0)
parse_XactIsoLevel(mvalue);
else if (strcasecmp(name, "client_encoding") == 0)
@ -737,8 +669,6 @@ GetPGVariable(const char *name)
show_datestyle();
else if (strcasecmp(name, "timezone") == 0)
show_timezone();
else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
show_DefaultXactIsoLevel();
else if (strcasecmp(name, "XactIsoLevel") == 0)
show_XactIsoLevel();
else if (strcasecmp(name, "client_encoding") == 0)
@ -752,7 +682,6 @@ GetPGVariable(const char *name)
ShowAllGUCConfig();
show_datestyle();
show_timezone();
show_DefaultXactIsoLevel();
show_XactIsoLevel();
show_client_encoding();
show_server_encoding();
@ -772,8 +701,6 @@ ResetPGVariable(const char *name)
reset_datestyle();
else if (strcasecmp(name, "timezone") == 0)
reset_timezone();
else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
reset_DefaultXactIsoLevel();
else if (strcasecmp(name, "XactIsoLevel") == 0)
reset_XactIsoLevel();
else if (strcasecmp(name, "client_encoding") == 0)
@ -784,8 +711,6 @@ ResetPGVariable(const char *name)
reset_random_seed();
else if (strcasecmp(name, "all") == 0)
{
reset_DefaultXactIsoLevel();
reset_XactIsoLevel();
reset_random_seed();
/* reset_server_encoding(); */
reset_client_encoding();
@ -793,7 +718,8 @@ ResetPGVariable(const char *name)
reset_timezone();
ResetAllOptions(false);
} else
}
else
SetConfigOption(name, NULL,
superuser() ? PGC_SUSET : PGC_USERSET,
false);

View File

@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.232 2001/06/23 00:07:34 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.233 2001/06/30 22:03:25 petere Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@ -752,7 +752,7 @@ VariableSetStmt: SET ColId TO var_value
| SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = "DefaultXactIsoLevel";
n->name = "default_transaction_isolation";
n->value = $8;
$$ = (Node *) n;
}
@ -772,7 +772,7 @@ VariableSetStmt: SET ColId TO var_value
}
;
opt_level: READ COMMITTED { $$ = "committed"; }
opt_level: READ COMMITTED { $$ = "read committed"; }
| SERIALIZABLE { $$ = "serializable"; }
;

View File

@ -4,7 +4,7 @@
* Support for grand unified configuration scheme, including SET
* command, configuration file, and command line options.
*
* $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.43 2001/06/27 23:31:39 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.44 2001/06/30 22:03:26 petere Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
@ -51,6 +51,11 @@ extern char *Syslog_ident;
static bool check_facility(const char *facility);
#endif
static char *default_iso_level_string;
static bool check_defaultxactisolevel(const char *value);
static void assign_defaultxactisolevel(const char *value);
/*
* Debugging options
*/
@ -355,6 +360,9 @@ static struct config_real
static struct config_string
ConfigureNamesString[] =
{
{"default_transaction_isolation", PGC_USERSET, &default_iso_level_string,
"read committed", check_defaultxactisolevel, assign_defaultxactisolevel},
{"dynamic_library_path", PGC_SUSET, &Dynamic_library_path,
"$libdir", NULL, NULL},
@ -1092,3 +1100,25 @@ check_facility(const char *facility)
}
#endif
static bool
check_defaultxactisolevel(const char *value)
{
return (strcasecmp(value, "read committed") == 0
|| strcasecmp(value, "serializable") == 0)
? true : false;
}
static void
assign_defaultxactisolevel(const char *value)
{
if (strcasecmp(value, "serializable") == 0)
DefaultXactIsoLevel = XACT_SERIALIZABLE;
else if (strcasecmp(value, "read committed") == 0)
DefaultXactIsoLevel = XACT_READ_COMMITTED;
else
elog(ERROR, "bogus transaction isolation level");
}

View File

@ -166,6 +166,7 @@
#
# Misc
#
#default_transaction_isolation = 'read committed'
#sql_inheritance = true
#australian_timezones = false
#deadlock_timeout = 1000