On Wed, Mar  1, 2023 at 09:45:00AM -0700, David G. Johnston wrote:
> On Wed, Mar 1, 2023 at 9:34 AM Tom Lane <t...@sss.pgh.pa.us> wrote:
> 
>     PG Doc comments form <nore...@postgresql.org> writes:
>     > I believe there is a mistake in an example on
>     > https://www.postgresql.org/docs/current/transaction-iso.html section
>     > 13.2.1:
>     > BEGIN;
>     > UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
>     > UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
>     > COMMIT;
> 
>     > The acctnum is expected to be 12345 in both cases.
> 
>     No, I think that's intentional: the example depicts transferring
>     $100 from account 7534 to account 12345.
> 
> 
> 
> That may be, but the descriptive text and point of the example (which isn't
> atomicity, but concurrency) doesn't even require the second update command to
> be present.  What the example could use is a more traditional two-session
> depiction of the commands instead of having a single transaction and letting
> the user envision the correct concurrency.
> 
> Something like:
> 
> S1: SELECT balance FROM accounts WHERE acctnum = 12345; //100
> S1: BEGIN;
> S2: BEGIN;
> S1: UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345; 
> //200
> S2: UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345; //
> WAITING ON S1
> S1: COMMIT;
> S2: UPDATED; balance = 300
> S2: COMMIT;
> 
> Though maybe "balance" isn't a good example domain, the incrementing example
> used just after this one seems more appropriate along with the added benefit 
> of
> consistency.

I developed the attached patch.  I explained the example, I mentioned a
"second" transaciton, I changed the account number so I can talk about
the second statement, because read committed changes the row visibility
of the non-first statements, and I changed "transaction" to "statement".

-- 
  Bruce Momjian  <br...@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

  Only you can decide what is important to you.
diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml
new file mode 100644
index f8f83d4..189cab0
*** a/doc/src/sgml/mvcc.sgml
--- b/doc/src/sgml/mvcc.sgml
***************
*** 413,420 ****
      does not see effects of those commands on other rows in the database.
      This behavior makes Read Committed mode unsuitable for commands that
      involve complex search conditions; however, it is just right for simpler
!     cases.  For example, consider updating bank balances with transactions
!     like:
  
  <screen>
  BEGIN;
--- 413,420 ----
      does not see effects of those commands on other rows in the database.
      This behavior makes Read Committed mode unsuitable for commands that
      involve complex search conditions; however, it is just right for simpler
!     cases.  For example, consider transferring $100 from one account
!     to another:
  
  <screen>
  BEGIN;
*************** UPDATE accounts SET balance = balance -
*** 423,430 ****
  COMMIT;
  </screen>
  
!     If two such transactions concurrently try to change the balance of account
!     12345, we clearly want the second transaction to start with the updated
      version of the account's row.  Because each command is affecting only a
      predetermined row, letting it see the updated version of the row does
      not create any troublesome inconsistency.
--- 423,430 ----
  COMMIT;
  </screen>
  
!     If another transactions concurrently tries to change the balance of account
!     7534, we clearly want the second statement to start with the updated
      version of the account's row.  Because each command is affecting only a
      predetermined row, letting it see the updated version of the row does
      not create any troublesome inconsistency.

Reply via email to