1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Implement waiting for given lsn at transaction start

This commit adds following optional clause to BEGIN and START TRANSACTION
commands.

  WAIT FOR LSN lsn [ TIMEOUT timeout ]

New clause pospones transaction start till given lsn is applied on standby.
This clause allows user be sure, that changes previously made on primary would
be visible on standby.

New shared memory struct is used to track awaited lsn per backend.  Recovery
process wakes up backend once required lsn is applied.

Author: Ivan Kartyshov, Anna Akenteva
Reviewed-by: Craig Ringer, Thomas Munro, Robert Haas, Kyotaro Horiguchi
Reviewed-by: Masahiko Sawada, Ants Aasma, Dmitry Ivanov, Simon Riggs
Reviewed-by: Amit Kapila, Alexander Korotkov
Discussion: https://postgr.es/m/0240c26c-9f84-30ea-fca9-93ab2df5f305%40postgrespro.ru
This commit is contained in:
Alexander Korotkov
2020-04-07 23:51:10 +03:00
parent 357889eb17
commit 0f5ca02f53
20 changed files with 585 additions and 10 deletions

View File

@ -21,7 +21,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ]
BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ] [ WAIT FOR LSN <replaceable class="parameter">lsn_value</replaceable> [TIMEOUT <replaceable class="parameter">number_of_milliseconds</replaceable> ] ]
<phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>
@ -63,6 +63,17 @@ BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</
<xref linkend="sql-set-transaction"/>
was executed.
</para>
<para>
The <literal>WAIT FOR</literal> clause allows to wait for the target log
sequence number (<acronym>LSN</acronym>) to be replayed on standby before
starting the transaction in <productname>PostgreSQL</productname> databases
with master-standby asynchronous replication. Wait time can be limited by
specifying a timeout, which is measured in milliseconds and must be a positive
integer. If <acronym>LSN</acronym> was not reached before timeout, transaction
doesn't begin. Waiting can be interrupted by cancelling
<literal>BEGIN</literal> command.
</para>
</refsect1>
<refsect1>
@ -146,6 +157,10 @@ BEGIN;
different purpose in embedded SQL. You are advised to be careful
about the transaction semantics when porting database applications.
</para>
<para>
There is no <literal>WAIT FOR</literal> clause in the SQL standard.
</para>
</refsect1>
<refsect1>

View File

@ -21,7 +21,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ]
START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ] [ WAIT FOR LSN <replaceable class="parameter">lsn_value</replaceable> [TIMEOUT <replaceable class="parameter">number_of_milliseconds</replaceable> ] ]
<phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>
@ -40,6 +40,17 @@ START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable
characteristics, as if <xref linkend="sql-set-transaction"/> was executed. This is the same
as the <xref linkend="sql-begin"/> command.
</para>
<para>
The <literal>WAIT FOR</literal> clause allows to wait for the target log
sequence number (<acronym>LSN</acronym>) to be replayed on standby before
starting the transaction in <productname>PostgreSQL</productname> databases
with master-standby asynchronous replication. Wait time can be limited by
specifying a timeout, which is measured in milliseconds and must be a positive
integer. If <acronym>LSN</acronym> was not reached before timeout, transaction
doesn't begin. Waiting can be interrupted by cancelling
<literal>START TRANSACTION</literal> command.
</para>
</refsect1>
<refsect1>
@ -78,6 +89,10 @@ START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable
omitted.
</para>
<para>
There is no <literal>WAIT FOR</literal> clause in the SQL standard.
</para>
<para>
See also the compatibility section of <xref linkend="sql-set-transaction"/>.
</para>