Re: Question about conccurrency control and Insert

From: Stéphane Cazeaux <stephane(dot)cazeaux(at)netcentrex(dot)net>
To:
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Question about conccurrency control and Insert
Date: 2003-09-10 11:54:04
Message-ID: 3F5F10DC.3040708@netcentrex.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Richard Huxton wrote:

>On Wednesday 10 September 2003 08:34, Stéphane Cazeaux wrote:
>
>
>>Client 1:
>> BEGIN;
>> SELECT count FROM test_count FOR UPDATE; --> returns the only entry "1"
>>
>>Client 2 :
>> BEGIN;
>> SELECT count FROM test_count FOR UPDATE; --> this query is blocked, ok
>>
>>We continue :
>>
>>Client 1:
>> INSERT INTO test_count VALUES (2);
>> COMMIT;
>>
>>Client 2: (after commit of client 1)
>> [The select that was blocked is now free. But the result is the
>>first row containing "1". I'm surprised by this result]
>> SELECT count FROM test_count; --> now returns the two rows, on
>>containing "1", the other containing "2"
>> COMMIT;
>>
>>So my question is : why the SELECT...FOR UPDATE of client 2, when
>>unblocked, returns only one row, and a following SELECT in the same
>>transaction returns two rows ? Is there a mechanisme I don't understand ?
>>
>>
>
>Client2's first SELECT started before you commited the INSERT, the second
>SELECT started after you commited. Since you are using READ COMMITTED you can
>read the results of transactions committed *before the current statement
>started*
>
I'm ok about this, but, if I try exactly the same scenario, where I
replace the INSERT by a DELETE, the first SELECT of the client 2 won't
return any row. This is the same behaviour with an UPDATE. If client 1
updates the row and commits, the first SELECT of client 2 will return
the updated row. Why isn't it the same behaviour with INSERT ?

>
>See Ch 9.2.1 (in Concurrency Control) for details:
>"Since in Read Committed mode each new query starts with a new snapshot that
>includes all transactions committed up to that instant, subsequent queries in
>the same transaction will see the effects of the committed concurrent
>transaction in any case."
>
>You'll be wanting "SERIALIZABLE" transaction isolation if you don't want this
>to happen.
>
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Francois Suter 2003-09-10 12:12:43 Re: The ..... worm
Previous Message Richard Huxton 2003-09-10 11:35:23 Re: Question about conccurrency control and Insert