From 5c63aa711568642f3b7b15c91f9def2113f00810 Mon Sep 17 00:00:00 2001 From: "David G. Johnston" 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 e15a3323dfbf..05539745e504 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 an error + occurs that prevents the transaction from completing, then none of the steps affect the database at all. @@ -218,7 +219,8 @@ UPDATE branches SET balance = balance + 100.00 In PostgreSQL, a transaction is set up by surrounding the SQL commands of the transaction with - BEGIN and COMMIT commands. So our banking + and + commands. So our banking transaction would actually look like: @@ -233,7 +235,7 @@ COMMIT; 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 ROLLBACK instead of + we can issue the command instead of COMMIT, and all our updates so far will be canceled. @@ -256,6 +258,16 @@ COMMIT; + + When an error occurs within a transaction block the transaction is not ended + but instead goes into an aborted state. While in this state all commands except + and are ignored and, + importantly, both those commands behave identically - they roll-back and close + the current transaction, returning the session to a state where new commands can + be issued. They will also automatically begin a new transaction if executed + with a AND CHAIN parameter. + + It's possible to control the statements in a transaction in a more granular fashion through the use of savepoints. Savepoints diff --git a/doc/src/sgml/ref/commit.sgml b/doc/src/sgml/ref/commit.sgml index 7e2dcac5a33a..876a971db602 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. + + If the transaction is in an aborted state then no changes will be made + and the effect of the COMMIT will be identical to that + of ROLLBACK, including the command tag output. + + + In either situation, if the AND CHAIN parameter is + specified a new, identically configured, transaction is started. + + + For more information regarding transactions see + . + @@ -67,6 +80,25 @@ COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] + + Outputs + + + On successful completion on a non-aborted transaction, a COMMIT + command returns a command tag of the form + +COMMIT + + + + However, on an aborted transaction, a COMMIT + command returns a command tag of the form + +ROLLBACK + + + + Notes @@ -107,6 +139,7 @@ COMMIT; +