mirror of https://github.com/postgres/postgres
parent
32cfa65e49
commit
165b830ea5
@ -1,190 +1,207 @@ |
|||||||
<REFENTRY ID="SQL-LOCK"> |
<REFENTRY ID="SQL-LOCK"> |
||||||
<REFMETA> |
<REFMETA> |
||||||
<REFENTRYTITLE> |
<REFENTRYTITLE> |
||||||
LOCK |
LOCK |
||||||
</REFENTRYTITLE> |
</REFENTRYTITLE> |
||||||
<REFMISCINFO>SQL - Language Statements</REFMISCINFO> |
<REFMISCINFO>SQL - Language Statements</REFMISCINFO> |
||||||
</REFMETA> |
</REFMETA> |
||||||
<REFNAMEDIV> |
<REFNAMEDIV> |
||||||
<REFNAME> |
<REFNAME> |
||||||
LOCK |
LOCK |
||||||
</REFNAME> |
</REFNAME> |
||||||
<REFPURPOSE> |
<REFPURPOSE> |
||||||
Explicit lock of a table inside a transaction |
Explicit lock of a table inside a transaction |
||||||
</REFPURPOSE> |
</REFPURPOSE> |
||||||
</refnamediv> |
</refnamediv> |
||||||
<REFSYNOPSISDIV> |
<REFSYNOPSISDIV> |
||||||
<REFSYNOPSISDIVINFO> |
<REFSYNOPSISDIVINFO> |
||||||
<DATE>1998-09-24</DATE> |
<DATE>1998-09-24</DATE> |
||||||
</REFSYNOPSISDIVINFO> |
</REFSYNOPSISDIVINFO> |
||||||
<SYNOPSIS> |
<SYNOPSIS> |
||||||
LOCK [ TABLE ] <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
LOCK [ TABLE ] <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
||||||
</SYNOPSIS> |
</SYNOPSIS> |
||||||
|
|
||||||
<REFSECT2 ID="R2-SQL-LOCK-1"> |
<REFSECT2 ID="R2-SQL-LOCK-1"> |
||||||
<REFSECT2INFO> |
<REFSECT2INFO> |
||||||
<DATE>1998-09-01</DATE> |
<DATE>1998-09-01</DATE> |
||||||
</REFSECT2INFO> |
</REFSECT2INFO> |
||||||
<TITLE> |
<TITLE> |
||||||
Inputs |
Inputs |
||||||
</TITLE> |
</TITLE> |
||||||
<PARA> |
<PARA> |
||||||
</PARA> |
</PARA> |
||||||
<VARIABLELIST> |
<VARIABLELIST> |
||||||
<VARLISTENTRY> |
<VARLISTENTRY> |
||||||
<TERM> |
<TERM> |
||||||
<REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
<REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
||||||
</TERM> |
</TERM> |
||||||
<LISTITEM> |
<LISTITEM> |
||||||
<PARA> |
<PARA> |
||||||
The name of an existing table to lock. |
The name of an existing table to lock. |
||||||
</para> |
</para> |
||||||
</listitem> |
</listitem> |
||||||
</varlistentry> |
</varlistentry> |
||||||
</VARIABLELIST> |
</VARIABLELIST> |
||||||
|
|
||||||
</REFSECT2> |
</REFSECT2> |
||||||
|
|
||||||
<REFSECT2 ID="R2-SQL-LOCK-2"> |
<REFSECT2 ID="R2-SQL-LOCK-2"> |
||||||
<REFSECT2INFO> |
<REFSECT2INFO> |
||||||
<DATE>1998-09-24</DATE> |
<DATE>1998-09-24</DATE> |
||||||
</REFSECT2INFO> |
</REFSECT2INFO> |
||||||
<TITLE> |
<TITLE> |
||||||
Outputs |
Outputs |
||||||
</TITLE> |
</TITLE> |
||||||
<PARA> |
<PARA> |
||||||
|
|
||||||
<VARIABLELIST> |
<VARIABLELIST> |
||||||
<VARLISTENTRY> |
<VARLISTENTRY> |
||||||
<TERM> |
<TERM> |
||||||
DELETE 0 |
DELETE 0 |
||||||
</TERM> |
</TERM> |
||||||
<LISTITEM> |
<LISTITEM> |
||||||
<PARA> |
<PARA> |
||||||
Message returned on a successful lock. |
Message returned on a successful lock. |
||||||
<command>LOCK</command> is implemented as a |
<command>LOCK</command> is implemented as a |
||||||
<command>DELETE FROM <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE></command> |
<command>DELETE FROM <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE></command> |
||||||
which is guaranteed to not delete any rows. |
which is guaranteed to not delete any rows. |
||||||
</para> |
</para> |
||||||
</listitem> |
</listitem> |
||||||
</varlistentry> |
</varlistentry> |
||||||
<VARLISTENTRY> |
<VARLISTENTRY> |
||||||
<TERM> |
<TERM> |
||||||
ERROR <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>: Table does not exist. |
ERROR <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE>: Table does not exist. |
||||||
</TERM> |
</TERM> |
||||||
<LISTITEM> |
<LISTITEM> |
||||||
<PARA> |
<PARA> |
||||||
Message returned if <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
Message returned if <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> |
||||||
does not exist. |
does not exist. |
||||||
</para> |
</para> |
||||||
</listitem> |
</listitem> |
||||||
</varlistentry> |
</varlistentry> |
||||||
</VARIABLELIST> |
</VARIABLELIST> |
||||||
</para> |
</para> |
||||||
</REFSECT2> |
</REFSECT2> |
||||||
</REFSYNOPSISDIV> |
</REFSYNOPSISDIV> |
||||||
|
|
||||||
<REFSECT1 ID="R1-SQL-LOCK-1"> |
<REFSECT1 ID="R1-SQL-LOCK-1"> |
||||||
<REFSECT1INFO> |
<REFSECT1INFO> |
||||||
<DATE>1998-09-24</DATE> |
<DATE>1998-09-24</DATE> |
||||||
</REFSECT1INFO> |
</REFSECT1INFO> |
||||||
<TITLE> |
<TITLE> |
||||||
Description |
Description |
||||||
</TITLE> |
</TITLE> |
||||||
<PARA> |
<PARA> |
||||||
<command>LOCK</command> locks in exclusive mode a table inside |
<command>LOCK</command> locks in exclusive mode a table inside |
||||||
a transaction. The classic use for this is |
a transaction. The classic use for this is |
||||||
the case where you want to select some data, then |
the case where you want to select some data, then |
||||||
update it inside a transaction. |
update it inside a transaction. |
||||||
If you don't explicit lock a table using LOCK statement, it will be |
If you don't explicit lock a table using LOCK statement, it will be |
||||||
implicit locked only at the first |
implicit locked only at the first |
||||||
<command>UPDATE</command>, <command>INSERT</command>, |
<command>UPDATE</command>, <command>INSERT</command>, |
||||||
or <command>DELETE</command> operation. |
or <command>DELETE</command> operation. |
||||||
If you don't exclusive lock the table before the select, some |
If you don't exclusive lock the table before the select, some |
||||||
other user may also read the selected data, and try and do |
other user may also read the selected data, and try and do |
||||||
their own update, causing a deadlock while you both wait |
their own update, causing a deadlock while you both wait |
||||||
for the other to release the select-induced shared lock so |
for the other to release the select-induced shared lock so |
||||||
you can get an exclusive lock to do the update. |
you can get an exclusive lock to do the update. |
||||||
</para> |
</para> |
||||||
<para> |
<para> |
||||||
Another example of deadlock is where one user locks one |
Another example of deadlock is where one user locks one |
||||||
table, and another user locks a second table. While both |
table, and another user locks a second table. While both |
||||||
keep their existing locks, the first user tries to lock |
keep their existing locks, the first user tries to lock |
||||||
the second user's table, and the second 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 first user's table. Both users deadlock waiting for |
||||||
the tables to become available. The only solution to this |
the tables to become available. The only solution to this |
||||||
is for both users to lock tables in the same order, so |
is for both users to lock tables in the same order, so |
||||||
user's lock acquisitions and requests to not form a deadlock. |
user's lock acquisitions and requests to not form a deadlock. |
||||||
</para> |
</para> |
||||||
<note> |
<note> |
||||||
<para> |
<para> |
||||||
<productname>Postgres</productname> does detect deadlocks and will |
<productname>Postgres</productname> does detect deadlocks and will |
||||||
rollback transactions to resolve the deadlock. Usually, at least one |
rollback transactions to resolve the deadlock. Usually, at least one |
||||||
of the deadlocked transactions will complete successfully. |
of the deadlocked transactions will complete successfully. |
||||||
</para> |
</para> |
||||||
</note> |
</note> |
||||||
|
|
||||||
<REFSECT2 ID="R2-SQL-LOCK-3"> |
<REFSECT2 ID="R2-SQL-LOCK-3"> |
||||||
<REFSECT2INFO> |
<REFSECT2INFO> |
||||||
<DATE>1998-09-24</DATE> |
<DATE>1998-09-24</DATE> |
||||||
</REFSECT2INFO> |
</REFSECT2INFO> |
||||||
<TITLE> |
<TITLE> |
||||||
Notes |
Notes |
||||||
</TITLE> |
</TITLE> |
||||||
<para> |
<para> |
||||||
<command>LOCK</command> is a <productname>Postgres</productname> |
<command>LOCK</command> is a <productname>Postgres</productname> |
||||||
language extension. |
language extension. |
||||||
</para> |
</para> |
||||||
<para> |
<para> |
||||||
<command>LOCK</command> works only inside transactions. |
<command>LOCK</command> works only inside transactions. |
||||||
|
|
||||||
<note> |
<note> |
||||||
<title>Bug</title> |
<title>Bug</title> |
||||||
<para> |
<para> |
||||||
If the locked table is dropped then it will be automatically |
If the locked table is dropped then it will be automatically |
||||||
unlocked even if a transaction is still in progress. |
unlocked even if a transaction is still in progress. |
||||||
</para> |
</para> |
||||||
</note> |
</note> |
||||||
</para> |
</para> |
||||||
</REFSECT2> |
</REFSECT2> |
||||||
</refsect1> |
</refsect1> |
||||||
|
|
||||||
<REFSECT1 ID="R1-SQL-LOCK-2"> |
<REFSECT1 ID="R1-SQL-LOCK-2"> |
||||||
<TITLE> |
<TITLE> |
||||||
Usage |
Usage |
||||||
</TITLE> |
</TITLE> |
||||||
<PARA> |
<PARA> |
||||||
</PARA> |
</PARA> |
||||||
<ProgramListing> |
<ProgramListing> |
||||||
--Explicit locking to prevent deadlock: |
--Explicit locking to prevent deadlock: |
||||||
-- |
-- |
||||||
BEGIN WORK; |
BEGIN WORK; |
||||||
LOCK films; |
LOCK films; |
||||||
SELECT * FROM films; |
SELECT * FROM films; |
||||||
UPDATE films SET len = INTERVAL '100 minute' |
UPDATE films SET len = INTERVAL '100 minute' |
||||||
WHERE len = INTERVAL '117 minute'; |
WHERE len = INTERVAL '117 minute'; |
||||||
COMMIT WORK; |
COMMIT WORK; |
||||||
</ProgramListing> |
</ProgramListing> |
||||||
|
|
||||||
</REFSECT1> |
</REFSECT1> |
||||||
|
|
||||||
<REFSECT1 ID="R1-SQL-LOCK-3"> |
<REFSECT1 ID="R1-SQL-LOCK-3"> |
||||||
<TITLE> |
<TITLE> |
||||||
Compatibility |
Compatibility |
||||||
</TITLE> |
</TITLE> |
||||||
|
|
||||||
<REFSECT2 ID="R2-SQL-LOCK-4"> |
<REFSECT2 ID="R2-SQL-LOCK-4"> |
||||||
<REFSECT2INFO> |
<REFSECT2INFO> |
||||||
<DATE>1998-09-24</DATE> |
<DATE>1998-09-24</DATE> |
||||||
</REFSECT2INFO> |
</REFSECT2INFO> |
||||||
<TITLE> |
<TITLE> |
||||||
SQL92 |
SQL92 |
||||||
</TITLE> |
</TITLE> |
||||||
<PARA> |
<PARA> |
||||||
There is no <command>LOCK TABLE</command> in <acronym>SQL92</acronym>, |
There is no <command>LOCK TABLE</command> in <acronym>SQL92</acronym>, |
||||||
which instead uses <command>SET TRANSACTION</command> to specify |
which instead uses <command>SET TRANSACTION</command> to specify |
||||||
concurrency level on transactions. |
concurrency level on transactions. |
||||||
</para> |
</para> |
||||||
</refsect2> |
</refsect2> |
||||||
</refsect1> |
</refsect1> |
||||||
</REFENTRY> |
</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: |
||||||
|
--> |
||||||
|
@ -0,0 +1,74 @@ |
|||||||
|
<REFENTRY ID="APP-PGACCESS"> |
||||||
|
<REFMETA> |
||||||
|
<REFENTRYTITLE id="pgaccess-ref"> |
||||||
|
<application>pgaccess</application> |
||||||
|
</REFENTRYTITLE> |
||||||
|
<REFMISCINFO>Application</REFMISCINFO> |
||||||
|
</REFMETA> |
||||||
|
<REFNAMEDIV> |
||||||
|
<REFNAME> |
||||||
|
<application>pgaccess</application> |
||||||
|
</REFNAME> |
||||||
|
<REFPURPOSE> |
||||||
|
<productname>Postgres</productname> graphical interactive client |
||||||
|
</REFPURPOSE> |
||||||
|
</refnamediv> |
||||||
|
<REFSYNOPSISDIV> |
||||||
|
<REFSYNOPSISDIVINFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSYNOPSISDIVINFO> |
||||||
|
<SYNOPSIS> |
||||||
|
pgaccess [ <replaceable class="parameter">dbname</replaceable> ] |
||||||
|
</SYNOPSIS> |
||||||
|
|
||||||
|
<REFSECT2 ID="R2-APP-PGACCESS-1"> |
||||||
|
<REFSECT2INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT2INFO> |
||||||
|
<TITLE> |
||||||
|
Inputs |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</refsect2> |
||||||
|
|
||||||
|
<REFSECT2 ID="R2-APP-PGACCESS-2"> |
||||||
|
<REFSECT2INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT2INFO> |
||||||
|
<TITLE> |
||||||
|
Outputs |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</refsect2> |
||||||
|
</refsynopsisdiv> |
||||||
|
|
||||||
|
<REFSECT1 ID="R1-APP-PGACCESS-1"> |
||||||
|
<REFSECT1INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT1INFO> |
||||||
|
<TITLE> |
||||||
|
Description |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</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: |
||||||
|
--> |
@ -0,0 +1,74 @@ |
|||||||
|
<REFENTRY ID="APP-PGADMIN"> |
||||||
|
<REFMETA> |
||||||
|
<REFENTRYTITLE id="pgadmin-ref"> |
||||||
|
<application>pgadmin</application> |
||||||
|
</REFENTRYTITLE> |
||||||
|
<REFMISCINFO>Application</REFMISCINFO> |
||||||
|
</REFMETA> |
||||||
|
<REFNAMEDIV> |
||||||
|
<REFNAME> |
||||||
|
<application>pgadmin</application> |
||||||
|
</REFNAME> |
||||||
|
<REFPURPOSE> |
||||||
|
<productname>Postgres</productname> graphical interactive client |
||||||
|
</REFPURPOSE> |
||||||
|
</refnamediv> |
||||||
|
<REFSYNOPSISDIV> |
||||||
|
<REFSYNOPSISDIVINFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSYNOPSISDIVINFO> |
||||||
|
<SYNOPSIS> |
||||||
|
pgadmin [ <replaceable class="parameter">dbname</replaceable> ] |
||||||
|
</SYNOPSIS> |
||||||
|
|
||||||
|
<REFSECT2 ID="R2-APP-PGADMIN-1"> |
||||||
|
<REFSECT2INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT2INFO> |
||||||
|
<TITLE> |
||||||
|
Inputs |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</refsect2> |
||||||
|
|
||||||
|
<REFSECT2 ID="R2-APP-PGADMIN-2"> |
||||||
|
<REFSECT2INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT2INFO> |
||||||
|
<TITLE> |
||||||
|
Outputs |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</refsect2> |
||||||
|
</refsynopsisdiv> |
||||||
|
|
||||||
|
<REFSECT1 ID="R1-APP-PGADMIN-1"> |
||||||
|
<REFSECT1INFO> |
||||||
|
<DATE>1999-05-19</DATE> |
||||||
|
</REFSECT1INFO> |
||||||
|
<TITLE> |
||||||
|
Description |
||||||
|
</TITLE> |
||||||
|
<PARA> |
||||||
|
</para> |
||||||
|
</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: |
||||||
|
--> |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue