From 10e9cd22991b352685fe49cfa92dbcd72048c711 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> 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 488ee6ac31c..aa97b2f7d43 100644 --- a/doc/src/sgml/ref/set_transaction.sgml +++ b/doc/src/sgml/ref/set_transaction.sgml @@ -1,4 +1,4 @@ -<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v 1.3 2000/11/24 20:16:38 petere Exp $ --> +<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v 1.4 2001/06/30 22:03:25 petere Exp $ --> <refentry id="SQL-SET-TRANSACTION"> <docinfo> <date>2000-11-24</date> @@ -74,6 +74,18 @@ SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL { READ COMMITTED | SE </para> </refsect1> + <refsect1> + <title>Notes</title> + + <para> + The session default transaction isolation level can also be set + with the command <literal>SET default_transaction_isolation = + '<replaceable>value</replaceable>'</literal> and in the + configuration file. Consult the <citetitle>Administrator's + Guide</citetitle> for more information. + </para> + </refsect1> + <refsect1 id="R1-SQL-SET-TRANSACTION-3"> <title>Compatibility</title> 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 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.71 2001/06/30 21:15:57 darcy Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.72 2001/06/30 22:03:25 petere Exp $ --> <Chapter Id="runtime"> @@ -996,6 +996,29 @@ env PGOPTIONS='-c geqo=off' psql </listitem> </varlistentry> + <varlistentry> + <indexterm> + <primary>transaction isolation level</primary> + </indexterm> + + <term>DEFAUL_TRANSACTION_ISOLATION (<type>string</type>)</term> + <listitem> + <para> + Each SQL transaction has an isolation level, which can be + either <quote>read committed</quote> or + <quote>serializable</quote>. This parameter controls what the + isolation level of each new transaction is set to. The + default is read committed. + </para> + + <para> + Consult the <citetitle>PostgreSQL User's Guide</citetitle> and + the command <command>SET TRANSACTION</command> for more + information. + </para> + </listitem> + </varlistentry> + <varlistentry> <term>DYNAMIC_LIBRARY_PATH (<type>string</type>)</term> <listitem> @@ -1051,9 +1074,9 @@ dynamic_library_path = '/usr/local/lib:/home/my_project/lib:$libdir:$libdir/cont will use the <function>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 <emphasis>not</> affect this consideration.) </para> 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 <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"); +} 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 -- GitLab