diff --git a/doc/src/sgml/ref/set_transaction.sgml b/doc/src/sgml/ref/set_transaction.sgml index 488ee6ac31c..aa97b2f7d43 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 730d031a0f9..f73bddf354b 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 dd94509a7f2..3d96ba18390 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 3c7d526a7b8..cf518f3cadd 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 c38d98d3911..96dc8399e1c 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 a3042bee83d..fad01e7f32e 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