ok
Direktori : /opt/alt/postgresql11/usr/share/doc/alt-postgresql11-9.2.24/html/ |
Current File : //opt/alt/postgresql11/usr/share/doc/alt-postgresql11-9.2.24/html/sql-set-transaction.html |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >SET TRANSACTION</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REV="MADE" HREF="mailto:pgsql-docs@postgresql.org"><LINK REL="HOME" TITLE="PostgreSQL 9.2.24 Documentation" HREF="index.html"><LINK REL="UP" TITLE="SQL Commands" HREF="sql-commands.html"><LINK REL="PREVIOUS" TITLE="SET SESSION AUTHORIZATION" HREF="sql-set-session-authorization.html"><LINK REL="NEXT" TITLE="SHOW" HREF="sql-show.html"><LINK REL="STYLESHEET" TYPE="text/css" HREF="stylesheet.css"><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"><META NAME="creation" CONTENT="2017-11-06T22:43:11"></HEAD ><BODY CLASS="REFENTRY" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="5" ALIGN="center" VALIGN="bottom" ><A HREF="index.html" >PostgreSQL 9.2.24 Documentation</A ></TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A TITLE="SET SESSION AUTHORIZATION" HREF="sql-set-session-authorization.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A HREF="sql-commands.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="60%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="20%" ALIGN="right" VALIGN="top" ><A TITLE="SHOW" HREF="sql-show.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><H1 ><A NAME="SQL-SET-TRANSACTION" ></A >SET TRANSACTION</H1 ><DIV CLASS="REFNAMEDIV" ><A NAME="AEN79051" ></A ><H2 >Name</H2 >SET TRANSACTION -- set the characteristics of the current transaction</DIV ><DIV CLASS="REFSYNOPSISDIV" ><A NAME="AEN79065" ></A ><H2 >Synopsis</H2 ><PRE CLASS="SYNOPSIS" >SET TRANSACTION <TT CLASS="REPLACEABLE" ><I >transaction_mode</I ></TT > [, ...] SET TRANSACTION SNAPSHOT <TT CLASS="REPLACEABLE" ><I >snapshot_id</I ></TT > SET SESSION CHARACTERISTICS AS TRANSACTION <TT CLASS="REPLACEABLE" ><I >transaction_mode</I ></TT > [, ...] <SPAN CLASS="phrase" ><SPAN CLASS="PHRASE" >where <TT CLASS="REPLACEABLE" ><I >transaction_mode</I ></TT > is one of:</SPAN ></SPAN > ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE</PRE ></DIV ><DIV CLASS="REFSECT1" ><A NAME="AEN79072" ></A ><H2 >Description</H2 ><P > The <TT CLASS="COMMAND" >SET TRANSACTION</TT > command sets the characteristics of the current transaction. It has no effect on any subsequent transactions. <TT CLASS="COMMAND" >SET SESSION CHARACTERISTICS</TT > sets the default transaction characteristics for subsequent transactions of a session. These defaults can be overridden by <TT CLASS="COMMAND" >SET TRANSACTION</TT > for an individual transaction. </P ><P > The available transaction characteristics are the transaction isolation level, the transaction access mode (read/write or read-only), and the deferrable mode. In addition, a snapshot can be selected, though only for the current transaction, not as a session default. </P ><P > The isolation level of a transaction determines what data the transaction can see when other transactions are running concurrently: <P ></P ></P><DIV CLASS="VARIABLELIST" ><DL ><DT ><TT CLASS="LITERAL" >READ COMMITTED</TT ></DT ><DD ><P > A statement can only see rows committed before it began. This is the default. </P ></DD ><DT ><TT CLASS="LITERAL" >REPEATABLE READ</TT ></DT ><DD ><P > All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction. </P ></DD ><DT ><TT CLASS="LITERAL" >SERIALIZABLE</TT ></DT ><DD ><P > All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction. If a pattern of reads and writes among concurrent serializable transactions would create a situation which could not have occurred for any serial (one-at-a-time) execution of those transactions, one of them will be rolled back with a <TT CLASS="LITERAL" >serialization_failure</TT > error. </P ></DD ></DL ></DIV ><P> The SQL standard defines one additional level, <TT CLASS="LITERAL" >READ UNCOMMITTED</TT >. In <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > <TT CLASS="LITERAL" >READ UNCOMMITTED</TT > is treated as <TT CLASS="LITERAL" >READ COMMITTED</TT >. </P ><P > The transaction isolation level cannot be changed after the first query or data-modification statement (<TT CLASS="COMMAND" >SELECT</TT >, <TT CLASS="COMMAND" >INSERT</TT >, <TT CLASS="COMMAND" >DELETE</TT >, <TT CLASS="COMMAND" >UPDATE</TT >, <TT CLASS="COMMAND" >FETCH</TT >, or <TT CLASS="COMMAND" >COPY</TT >) of a transaction has been executed. See <A HREF="mvcc.html" >Chapter 13</A > for more information about transaction isolation and concurrency control. </P ><P > The transaction access mode determines whether the transaction is read/write or read-only. Read/write is the default. When a transaction is read-only, the following SQL commands are disallowed: <TT CLASS="LITERAL" >INSERT</TT >, <TT CLASS="LITERAL" >UPDATE</TT >, <TT CLASS="LITERAL" >DELETE</TT >, and <TT CLASS="LITERAL" >COPY FROM</TT > if the table they would write to is not a temporary table; all <TT CLASS="LITERAL" >CREATE</TT >, <TT CLASS="LITERAL" >ALTER</TT >, and <TT CLASS="LITERAL" >DROP</TT > commands; <TT CLASS="LITERAL" >COMMENT</TT >, <TT CLASS="LITERAL" >GRANT</TT >, <TT CLASS="LITERAL" >REVOKE</TT >, <TT CLASS="LITERAL" >TRUNCATE</TT >; and <TT CLASS="LITERAL" >EXPLAIN ANALYZE</TT > and <TT CLASS="LITERAL" >EXECUTE</TT > if the command they would execute is among those listed. This is a high-level notion of read-only that does not prevent all writes to disk. </P ><P > The <TT CLASS="LITERAL" >DEFERRABLE</TT > transaction property has no effect unless the transaction is also <TT CLASS="LITERAL" >SERIALIZABLE</TT > and <TT CLASS="LITERAL" >READ ONLY</TT >. When all three of these properties are selected for a transaction, the transaction may block when first acquiring its snapshot, after which it is able to run without the normal overhead of a <TT CLASS="LITERAL" >SERIALIZABLE</TT > transaction and without any risk of contributing to or being canceled by a serialization failure. This mode is well suited for long-running reports or backups. </P ><P > The <TT CLASS="LITERAL" >SET TRANSACTION SNAPSHOT</TT > command allows a new transaction to run with the same <I CLASS="FIRSTTERM" >snapshot</I > as an existing transaction. The pre-existing transaction must have exported its snapshot with the <TT CLASS="LITERAL" >pg_export_snapshot</TT > function (see <A HREF="functions-admin.html#FUNCTIONS-SNAPSHOT-SYNCHRONIZATION" >Section 9.26.5</A >). That function returns a snapshot identifier, which must be given to <TT CLASS="LITERAL" >SET TRANSACTION SNAPSHOT</TT > to specify which snapshot is to be imported. The identifier must be written as a string literal in this command, for example <TT CLASS="LITERAL" >'000003A1-1'</TT >. <TT CLASS="LITERAL" >SET TRANSACTION SNAPSHOT</TT > can only be executed at the start of a transaction, before the first query or data-modification statement (<TT CLASS="COMMAND" >SELECT</TT >, <TT CLASS="COMMAND" >INSERT</TT >, <TT CLASS="COMMAND" >DELETE</TT >, <TT CLASS="COMMAND" >UPDATE</TT >, <TT CLASS="COMMAND" >FETCH</TT >, or <TT CLASS="COMMAND" >COPY</TT >) of the transaction. Furthermore, the transaction must already be set to <TT CLASS="LITERAL" >SERIALIZABLE</TT > or <TT CLASS="LITERAL" >REPEATABLE READ</TT > isolation level (otherwise, the snapshot would be discarded immediately, since <TT CLASS="LITERAL" >READ COMMITTED</TT > mode takes a new snapshot for each command). If the importing transaction uses <TT CLASS="LITERAL" >SERIALIZABLE</TT > isolation level, then the transaction that exported the snapshot must also use that isolation level. Also, a non-read-only serializable transaction cannot import a snapshot from a read-only transaction. </P ></DIV ><DIV CLASS="REFSECT1" ><A NAME="AEN79146" ></A ><H2 >Notes</H2 ><P > If <TT CLASS="COMMAND" >SET TRANSACTION</TT > is executed without a prior <TT CLASS="COMMAND" >START TRANSACTION</TT > or <TT CLASS="COMMAND" >BEGIN</TT >, it will appear to have no effect, since the transaction will immediately end. </P ><P > It is possible to dispense with <TT CLASS="COMMAND" >SET TRANSACTION</TT > by instead specifying the desired <TT CLASS="REPLACEABLE" ><I >transaction_modes</I ></TT > in <TT CLASS="COMMAND" >BEGIN</TT > or <TT CLASS="COMMAND" >START TRANSACTION</TT >. But that option is not available for <TT CLASS="COMMAND" >SET TRANSACTION SNAPSHOT</TT >. </P ><P > The session default transaction modes can also be set by setting the configuration parameters <A HREF="runtime-config-client.html#GUC-DEFAULT-TRANSACTION-ISOLATION" >default_transaction_isolation</A >, <A HREF="runtime-config-client.html#GUC-DEFAULT-TRANSACTION-READ-ONLY" >default_transaction_read_only</A >, and <A HREF="runtime-config-client.html#GUC-DEFAULT-TRANSACTION-DEFERRABLE" >default_transaction_deferrable</A >. (In fact <TT CLASS="COMMAND" >SET SESSION CHARACTERISTICS</TT > is just a verbose equivalent for setting these variables with <TT CLASS="COMMAND" >SET</TT >.) This means the defaults can be set in the configuration file, via <TT CLASS="COMMAND" >ALTER DATABASE</TT >, etc. Consult <A HREF="runtime-config.html" >Chapter 18</A > for more information. </P ></DIV ><DIV CLASS="REFSECT1" ><A NAME="AEN79166" ></A ><H2 >Examples</H2 ><P > To begin a new transaction with the same snapshot as an already existing transaction, first export the snapshot from the existing transaction. That will return the snapshot identifier, for example: </P><PRE CLASS="PROGRAMLISTING" >BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT pg_export_snapshot(); pg_export_snapshot -------------------- 000003A1-1 (1 row)</PRE ><P> Then give the snapshot identifier in a <TT CLASS="COMMAND" >SET TRANSACTION SNAPSHOT</TT > command at the beginning of the newly opened transaction: </P><PRE CLASS="PROGRAMLISTING" >BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT '000003A1-1';</PRE ><P></P ></DIV ><DIV CLASS="REFSECT1" ><A NAME="R1-SQL-SET-TRANSACTION-3" ></A ><H2 >Compatibility</H2 ><P > These commands are defined in the <ACRONYM CLASS="ACRONYM" >SQL</ACRONYM > standard, except for the <TT CLASS="LITERAL" >DEFERRABLE</TT > transaction mode and the <TT CLASS="COMMAND" >SET TRANSACTION SNAPSHOT</TT > form, which are <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > extensions. </P ><P > <TT CLASS="LITERAL" >SERIALIZABLE</TT > is the default transaction isolation level in the standard. In <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > the default is ordinarily <TT CLASS="LITERAL" >READ COMMITTED</TT >, but you can change it as mentioned above. </P ><P > In the SQL standard, there is one other transaction characteristic that can be set with these commands: the size of the diagnostics area. This concept is specific to embedded SQL, and therefore is not implemented in the <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > server. </P ><P > The SQL standard requires commas between successive <TT CLASS="REPLACEABLE" ><I >transaction_modes</I ></TT >, but for historical reasons <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > allows the commas to be omitted. </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="sql-set-session-authorization.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="sql-show.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >SET SESSION AUTHORIZATION</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="sql-commands.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >SHOW</TD ></TR ></TABLE ></DIV ></BODY ></HTML >