Re: A contradiction in 13.2.1

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: Dane Foster <studdugie(at)gmail(dot)com>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: A contradiction in 13.2.1
Date: 2016-01-27 22:59:46
Message-ID: CAKFQuwYHnaZS21qDgTJ6PyVn7_b_V5gCYpx1Tw0T8pGeuj3coQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Jan 27, 2016 at 3:23 PM, Dane Foster <studdugie(at)gmail(dot)com> wrote:

> Hello,
>
> I'm trying to understand concurrency in PostgreSQL so I'm slowly reading
> through chapter 13 of the fine manual and I believe I've found a
> contradiction in section 13.2.1.
>
> ​My understanding of the second sentence of the first paragraph is that
> read committed mode never sees "changes committed during query execution by
> concurrent transactions". For example let's assume two transactions, A & B,
> and the following:
>
> - A started before B
> - B starts before A commits
>
> My understanding of the second sentence means that if A commits before B
> then any updates made by A will continue to be invisible to B because B's
> snapshot was before A committed. Now if I'm wrong about this then there is
> no contradiction forthcoming.
> The final sentence of the first paragraph is where I find the
> contradiction. It says: "Also note that two successive SELECT commands
> can see different data, even though they are within a single transaction,
> if other transactions commit changes after the first SELECT starts and
> before the second SELECT starts​"
> ​.
>
> So the mental model I've built based on the first four sentences of the
> first paragraph is that when a transaction starts in read committed mode a
> snapshot is taken of the (database) universe as it exists at the moment of
> its creation and that it's only updated by changes made by the transaction
> that created the snapshot. So for successive SELECTs to see different data
> because of updates outside of the transaction that created the snapshot is
> a contradiction.
>
> Now my guess is that I'm thinking about it all wrong so if someone in the
> know could shed some light on where/how my mental model breaks down I would
> appreciate it.
>
> Regards,
>
> Dane
>

​The main thing to remember is that "query != transaction".​

A1 - BEGIN;
​A1 - SELECT FROM a
B1 - BEGIN;
B2 - UPDATE a
B3 - COMMIT;
A2 - SELECT FROM a - again
A3 - COMMIT;

Since the commit in B3 occurs before the second select A2 in READ COMMITTED
the query A2 *will see* the update made in B2. But B3 must complete in its
entirety for A2 to see it otherwise "it never sees [...] changes committed
during query execution by concurrent transactions". The concurrency is
with the individual statement A2 and not the entire A transaction. This is
why it is called "READ COMMITTED" because within transaction A externally
committed data is able to be read.

David J.



In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Andrew Sullivan 2016-01-27 23:02:00 Re: Catalog bloat (again)
Previous Message Ivan Voras 2016-01-27 22:54:37 Catalog bloat (again)