Hi, The commit reference page lacks an "Outputs" section even though it is capable of outputting both "COMMIT" and "ROLLBACK".
The attached adds this section, describes when each applies, and then incorporates the same into the main description for commit as well as the transaction section of the tutorial - which presently seems to be the main discussion area for the topic (the Concurrency Control chapter lacks a section for this introductory material). This was noted as being needed by Tom Lane back into 2006 but it never happened. https://www.postgresql.org/message-id/28798.1142608067%40sss.pgh.pa.us It came up again when I was answering a question on Slack regarding "commit and chain" wondering whether the "and chain" could be made conditional (i.e., could the new transaction start aborted) on whether commit outputted "commit" or "rollback". Its left implied that this behavior of "rollback" is standard-conforming. Please feel free to suggest/add language to the Compatibility section if this is not the case. David J.
From f9c40e72c8e62ae7b364a82d26a0f73995ef5082 Mon Sep 17 00:00:00 2001 From: "David G. Johnston" <david.g.johns...@gmail.com> Date: Fri, 20 Dec 2024 08:40:47 -0700 Subject: [PATCH] doc: Commit performs rollback of aborted transactions The Commit command handles an aborted transaction in the same manner as the Rollback command. This needs to be documented. Add it to both the reference page as well mentioning the behavior in the official material for introducting transactions - the tutorial. In passing, make the description of the Commit reference page self-contained by mentioning the 'and chain' behavior. --- doc/src/sgml/advanced.sgml | 18 +++++++++++++++--- doc/src/sgml/ref/commit.sgml | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml index 755c9f1485..b5cae2335c 100644 --- a/doc/src/sgml/advanced.sgml +++ b/doc/src/sgml/advanced.sgml @@ -149,7 +149,8 @@ DETAIL: Key (city)=(Berkeley) is not present in table "cities". systems. The essential point of a transaction is that it bundles multiple steps into a single, all-or-nothing operation. The intermediate states between the steps are not visible to other concurrent transactions, - and if some failure occurs that prevents the transaction from completing, + and if <link linkend="tutorial-transactions-aborted">some failure</link> + occurs that prevents the transaction from completing, then none of the steps affect the database at all. </para> @@ -218,7 +219,8 @@ UPDATE branches SET balance = balance + 100.00 <para> In <productname>PostgreSQL</productname>, a transaction is set up by surrounding the SQL commands of the transaction with - <command>BEGIN</command> and <command>COMMIT</command> commands. So our banking + <xref linkend="sql-begin"/> and + <xref linkend="sql-commit"/> commands. So our banking transaction would actually look like: <programlisting> @@ -233,7 +235,7 @@ COMMIT; <para> If, partway through the transaction, we decide we do not want to commit (perhaps we just noticed that Alice's balance went negative), - we can issue the command <command>ROLLBACK</command> instead of + we can issue the command <xref linkend="sql-rollback"/> instead of <command>COMMIT</command>, and all our updates so far will be canceled. </para> @@ -256,6 +258,16 @@ COMMIT; </para> </note> + <para id="tutorial-transactions-aborted"> + When a failure does occur during a transaction it is not ended but instead + goes into an aborted state. While in this state all commands except + <xref linkend="sql-commit"/> and <xref linkend="sql-rollback"/> are ignored and, + importantly, both those commands behave identically - they roll-back and close + the current transaction and return the session to a state where new commands can + be issued. They will also automatically begin a new transaction if executed + with a <literal>AND CHAIN</literal> parameter. + </para> + <para> It's possible to control the statements in a transaction in a more granular fashion through the use of <firstterm>savepoints</firstterm>. Savepoints diff --git a/doc/src/sgml/ref/commit.sgml b/doc/src/sgml/ref/commit.sgml index 7e2dcac5a3..e4ef573fe5 100644 --- a/doc/src/sgml/ref/commit.sgml +++ b/doc/src/sgml/ref/commit.sgml @@ -33,6 +33,19 @@ COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] changes made by the transaction become visible to others and are guaranteed to be durable if a crash occurs. </para> + <para> + If no changes have been made - because the transaction is in an + aborted state - the effect of the commit will look like a rollback, + including the command tag output. + </para> + <para> + In either situation, if the <literal>AND CHAIN</literal> parameter is + specified a new, identically configured, transaction is started. + </para> + <para> + For more information regarding transactions see + <xref linkend="tutorial-transactions"/>. + </para> </refsect1> <refsect1> @@ -67,6 +80,25 @@ COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] </variablelist> </refsect1> + <refsect1> + <title>Outputs</title> + + <para> + On successful completion on a non-aborted transaction, a <command>COMMIT</command> + command returns a command tag of the form +<screen> +COMMIT +</screen> + </para> + <para> + However, if the transaction being affected is aborted, a <command>COMMIT</command> + command returns a command tag of the form +<screen> +ROLLBACK +</screen> + </para> + </refsect1> + <refsect1> <title>Notes</title> @@ -107,6 +139,7 @@ COMMIT; <simplelist type="inline"> <member><xref linkend="sql-begin"/></member> <member><xref linkend="sql-rollback"/></member> + <member><xref linkend="tutorial-transactions"/></member> </simplelist> </refsect1> </refentry> -- 2.34.1