From 10e9cd22991b352685fe49cfa92dbcd72048c711 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 30 Jun 2001 22:03:26 +0000 Subject: [PATCH] Allow default transaction isolation level (a.k.a. set session characteristics) to be set through GUC. --- doc/src/sgml/ref/set_transaction.sgml | 14 +++- doc/src/sgml/runtime.sgml | 31 ++++++- src/backend/commands/variable.c | 82 +------------------ src/backend/parser/gram.y | 6 +- src/backend/utils/misc/guc.c | 32 +++++++- src/backend/utils/misc/postgresql.conf.sample | 1 + 6 files changed, 79 insertions(+), 87 deletions(-) diff --git a/doc/src/sgml/ref/set_transaction.sgml b/doc/src/sgml/ref/set_transaction.sgml index 488ee6ac31..aa97b2f7d4 100644 --- a/doc/src/sgml/ref/set_transaction.sgml +++ b/doc/src/sgml/ref/set_transaction.sgml @@ -1,4 +1,4 @@ - + 2000-11-24 @@ -74,6 +74,18 @@ SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL { READ COMMITTED | SE + + Notes + + + The session default transaction isolation level can also be set + with the command SET default_transaction_isolation = + 'value' and in the + configuration file. Consult the Administrator's + Guide for more information. + + + Compatibility diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 730d031a0f..f73bddf354 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1,5 +1,5 @@ @@ -996,6 +996,29 @@ env PGOPTIONS='-c geqo=off' psql + + + transaction isolation level + + + DEFAUL_TRANSACTION_ISOLATION (string) + + + Each SQL transaction has an isolation level, which can be + either read committed or + serializable. This parameter controls what the + isolation level of each new transaction is set to. The + default is read committed. + + + + Consult the PostgreSQL User's Guide and + the command SET TRANSACTION for more + information. + + + + DYNAMIC_LIBRARY_PATH (string) @@ -1051,9 +1074,9 @@ dynamic_library_path = '/usr/local/lib:/home/my_project/lib:$libdir:$libdir/cont will use the fsync() system call in several places to make sure that updates are physically written to disk and do not hang around in the kernel buffer cache. This - increases the chance that a database installation will still - be usable after an operating system or hardware crash by a - large amount. (Crashes of the database server itself do + increases the chance by a large amount that a database + installation will still be usable after an operating system or + hardware crash. (Crashes of the database server itself do not affect this consideration.) diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index dd94509a7f..3d96ba1839 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -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); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 3c7d526a7b..cf518f3cad 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -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"; } ; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index c38d98d391..96dc8399e1 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -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 . @@ -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"); +} diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index a3042bee83..fad01e7f32 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -166,6 +166,7 @@ # # Misc # +#default_transaction_isolation = 'read committed' #sql_inheritance = true #australian_timezones = false #deadlock_timeout = 1000