aboutsummaryrefslogtreecommitdiff
path: root/doc/src/sgml/ref/lock.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/ref/lock.sgml')
-rw-r--r--doc/src/sgml/ref/lock.sgml375
1 files changed, 196 insertions, 179 deletions
diff --git a/doc/src/sgml/ref/lock.sgml b/doc/src/sgml/ref/lock.sgml
index 0d2c5047523..dc702b0cdb8 100644
--- a/doc/src/sgml/ref/lock.sgml
+++ b/doc/src/sgml/ref/lock.sgml
@@ -1,190 +1,207 @@
<REFENTRY ID="SQL-LOCK">
-<REFMETA>
-<REFENTRYTITLE>
-LOCK
-</REFENTRYTITLE>
-<REFMISCINFO>SQL - Language Statements</REFMISCINFO>
-</REFMETA>
-<REFNAMEDIV>
-<REFNAME>
-LOCK
-</REFNAME>
-<REFPURPOSE>
-Explicit lock of a table inside a transaction
-</REFPURPOSE>
- </refnamediv>
-<REFSYNOPSISDIV>
-<REFSYNOPSISDIVINFO>
-<DATE>1998-09-24</DATE>
-</REFSYNOPSISDIVINFO>
-<SYNOPSIS>
-LOCK [ TABLE ] <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
-</SYNOPSIS>
+ <REFMETA>
+ <REFENTRYTITLE>
+ LOCK
+ </REFENTRYTITLE>
+ <REFMISCINFO>SQL - Language Statements</REFMISCINFO>
+ </REFMETA>
+ <REFNAMEDIV>
+ <REFNAME>
+ LOCK
+ </REFNAME>
+ <REFPURPOSE>
+ Explicit lock of a table inside a transaction
+ </REFPURPOSE>
+ </refnamediv>
+ <REFSYNOPSISDIV>
+ <REFSYNOPSISDIVINFO>
+ <DATE>1998-09-24</DATE>
+ </REFSYNOPSISDIVINFO>
+ <SYNOPSIS>
+ LOCK [ TABLE ] <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
+ </SYNOPSIS>
- <REFSECT2 ID="R2-SQL-LOCK-1">
- <REFSECT2INFO>
- <DATE>1998-09-01</DATE>
- </REFSECT2INFO>
- <TITLE>
- Inputs
- </TITLE>
- <PARA>
- </PARA>
- <VARIABLELIST>
- <VARLISTENTRY>
- <TERM>
- <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
- </TERM>
- <LISTITEM>
- <PARA>
- The name of an existing table to lock.
- </para>
- </listitem>
- </varlistentry>
- </VARIABLELIST>
+ <REFSECT2 ID="R2-SQL-LOCK-1">
+ <REFSECT2INFO>
+ <DATE>1998-09-01</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Inputs
+ </TITLE>
+ <PARA>
+ </PARA>
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ The name of an existing table to lock.
+ </para>
+ </listitem>
+ </varlistentry>
+ </VARIABLELIST>
- </REFSECT2>
+ </REFSECT2>
- <REFSECT2 ID="R2-SQL-LOCK-2">
- <REFSECT2INFO>
- <DATE>1998-09-24</DATE>
- </REFSECT2INFO>
- <TITLE>
- Outputs
- </TITLE>
- <PARA>
-
- <VARIABLELIST>
- <VARLISTENTRY>
- <TERM>
- DELETE 0
- </TERM>
- <LISTITEM>
- <PARA>
- Message returned on a successful lock.
- <command>LOCK</command> is implemented as a
- <command>DELETE FROM <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE></command>
- which is guaranteed to not delete any rows.
- </para>
- </listitem>
- </varlistentry>
- <VARLISTENTRY>
- <TERM>
- ERROR <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>: Table does not exist.
- </TERM>
- <LISTITEM>
- <PARA>
- Message returned if <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
- does not exist.
- </para>
- </listitem>
- </varlistentry>
- </VARIABLELIST>
- </para>
- </REFSECT2>
- </REFSYNOPSISDIV>
+ <REFSECT2 ID="R2-SQL-LOCK-2">
+ <REFSECT2INFO>
+ <DATE>1998-09-24</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Outputs
+ </TITLE>
+ <PARA>
+
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ DELETE 0
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ Message returned on a successful lock.
+ <command>LOCK</command> is implemented as a
+ <command>DELETE FROM <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE></command>
+ which is guaranteed to not delete any rows.
+ </para>
+ </listitem>
+ </varlistentry>
+ <VARLISTENTRY>
+ <TERM>
+ ERROR <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>: Table does not exist.
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ Message returned if <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>
+ does not exist.
+ </para>
+ </listitem>
+ </varlistentry>
+ </VARIABLELIST>
+ </para>
+ </REFSECT2>
+ </REFSYNOPSISDIV>
- <REFSECT1 ID="R1-SQL-LOCK-1">
- <REFSECT1INFO>
- <DATE>1998-09-24</DATE>
- </REFSECT1INFO>
- <TITLE>
- Description
- </TITLE>
- <PARA>
- <command>LOCK</command> locks in exclusive mode a table inside
- a transaction. The classic use for this is
- the case where you want to select some data, then
- update it inside a transaction.
- If you don't explicit lock a table using LOCK statement, it will be
- implicit locked only at the first
- <command>UPDATE</command>, <command>INSERT</command>,
- or <command>DELETE</command> operation.
- If you don't exclusive lock the table before the select, some
- other user may also read the selected data, and try and do
- their own update, causing a deadlock while you both wait
- for the other to release the select-induced shared lock so
- you can get an exclusive lock to do the update.
- </para>
- <para>
- Another example of deadlock is where one user locks one
- table, and another user locks a second table. While both
- keep their existing locks, the first user tries to lock
- the second user's table, and the second user tries to lock
- the first user's table. Both users deadlock waiting for
- the tables to become available. The only solution to this
- is for both users to lock tables in the same order, so
- user's lock acquisitions and requests to not form a deadlock.
- </para>
- <note>
- <para>
- <productname>Postgres</productname> does detect deadlocks and will
- rollback transactions to resolve the deadlock. Usually, at least one
- of the deadlocked transactions will complete successfully.
- </para>
- </note>
+ <REFSECT1 ID="R1-SQL-LOCK-1">
+ <REFSECT1INFO>
+ <DATE>1998-09-24</DATE>
+ </REFSECT1INFO>
+ <TITLE>
+ Description
+ </TITLE>
+ <PARA>
+ <command>LOCK</command> locks in exclusive mode a table inside
+ a transaction. The classic use for this is
+ the case where you want to select some data, then
+ update it inside a transaction.
+ If you don't explicit lock a table using LOCK statement, it will be
+ implicit locked only at the first
+ <command>UPDATE</command>, <command>INSERT</command>,
+ or <command>DELETE</command> operation.
+ If you don't exclusive lock the table before the select, some
+ other user may also read the selected data, and try and do
+ their own update, causing a deadlock while you both wait
+ for the other to release the select-induced shared lock so
+ you can get an exclusive lock to do the update.
+ </para>
+ <para>
+ Another example of deadlock is where one user locks one
+ table, and another user locks a second table. While both
+ keep their existing locks, the first user tries to lock
+ the second user's table, and the second user tries to lock
+ the first user's table. Both users deadlock waiting for
+ the tables to become available. The only solution to this
+ is for both users to lock tables in the same order, so
+ user's lock acquisitions and requests to not form a deadlock.
+ </para>
+ <note>
+ <para>
+ <productname>Postgres</productname> does detect deadlocks and will
+ rollback transactions to resolve the deadlock. Usually, at least one
+ of the deadlocked transactions will complete successfully.
+ </para>
+ </note>
- <REFSECT2 ID="R2-SQL-LOCK-3">
- <REFSECT2INFO>
- <DATE>1998-09-24</DATE>
- </REFSECT2INFO>
- <TITLE>
- Notes
- </TITLE>
- <para>
- <command>LOCK</command> is a <productname>Postgres</productname>
- language extension.
- </para>
- <para>
- <command>LOCK</command> works only inside transactions.
-
- <note>
- <title>Bug</title>
- <para>
- If the locked table is dropped then it will be automatically
- unlocked even if a transaction is still in progress.
- </para>
- </note>
- </para>
- </REFSECT2>
- </refsect1>
+ <REFSECT2 ID="R2-SQL-LOCK-3">
+ <REFSECT2INFO>
+ <DATE>1998-09-24</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Notes
+ </TITLE>
+ <para>
+ <command>LOCK</command> is a <productname>Postgres</productname>
+ language extension.
+ </para>
+ <para>
+ <command>LOCK</command> works only inside transactions.
+
+ <note>
+ <title>Bug</title>
+ <para>
+ If the locked table is dropped then it will be automatically
+ unlocked even if a transaction is still in progress.
+ </para>
+ </note>
+ </para>
+ </REFSECT2>
+ </refsect1>
- <REFSECT1 ID="R1-SQL-LOCK-2">
- <TITLE>
- Usage
- </TITLE>
- <PARA>
- </PARA>
- <ProgramListing>
- --Explicit locking to prevent deadlock:
- --
- BEGIN WORK;
- LOCK films;
- SELECT * FROM films;
- UPDATE films SET len = INTERVAL '100 minute'
- WHERE len = INTERVAL '117 minute';
- COMMIT WORK;
- </ProgramListing>
+ <REFSECT1 ID="R1-SQL-LOCK-2">
+ <TITLE>
+ Usage
+ </TITLE>
+ <PARA>
+ </PARA>
+ <ProgramListing>
+ --Explicit locking to prevent deadlock:
+ --
+ BEGIN WORK;
+ LOCK films;
+ SELECT * FROM films;
+ UPDATE films SET len = INTERVAL '100 minute'
+ WHERE len = INTERVAL '117 minute';
+ COMMIT WORK;
+ </ProgramListing>
- </REFSECT1>
+ </REFSECT1>
- <REFSECT1 ID="R1-SQL-LOCK-3">
- <TITLE>
- Compatibility
- </TITLE>
+ <REFSECT1 ID="R1-SQL-LOCK-3">
+ <TITLE>
+ Compatibility
+ </TITLE>
- <REFSECT2 ID="R2-SQL-LOCK-4">
- <REFSECT2INFO>
- <DATE>1998-09-24</DATE>
- </REFSECT2INFO>
- <TITLE>
- SQL92
- </TITLE>
- <PARA>
- There is no <command>LOCK TABLE</command> in <acronym>SQL92</acronym>,
- which instead uses <command>SET TRANSACTION</command> to specify
- concurrency level on transactions.
- </para>
- </refsect2>
- </refsect1>
+ <REFSECT2 ID="R2-SQL-LOCK-4">
+ <REFSECT2INFO>
+ <DATE>1998-09-24</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ SQL92
+ </TITLE>
+ <PARA>
+ There is no <command>LOCK TABLE</command> in <acronym>SQL92</acronym>,
+ which instead uses <command>SET TRANSACTION</command> to specify
+ concurrency level on transactions.
+ </para>
+ </refsect2>
+ </refsect1>
</REFENTRY>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:nil
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:"../reference.ced"
+sgml-exposed-tags:nil
+sgml-local-catalogs:"/usr/lib/sgml/CATALOG"
+sgml-local-ecat-files:nil
+End:
+-->