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-11 07:26:52
Message-ID: 3F6023BC.5030605@netcentrex.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

It's now clearer for me. Thanks a lot for you long explanation.

--
Stéphane

Richard Huxton wrote:

>On Wednesday 10 September 2003 12:54, Stéphane Cazeaux wrote:
>
>
>>Richard Huxton wrote:
>>
>>
>>>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 ?
>>
>>
>
>Client2's first select can't decide whether to block until it has built a
>"candidate list" of rows it wants to return. Having built its list, it
>notices that one is locked by Client1 and waits to see what happens.
>
>If Client1 deletes the row, Client2 can't return it. If Client1 inserts an
>additional row, the "candidate list" is already built so it doesn't get
>included.
>
>For Client2 to notice any "new" rows, it would have to re-run the query.
>Obviously, for some queries this could be very expensive.
>If that wasn't bad enough, if another client was updating the table you'd have
>to wait again until it committed/rolled back its transaction to see what to
>do. With a busy database you could end up running the query dozens of times
>to check whether any data you were interested in had been inserted. What's
>worse, all your other clients might well be doing the same waiting for
>Client2.
>
>If you use a SERIALIZABLE transaction level, then it guarantees Client2 only
>sees data that was committed before Client2's transaction started. This means
>within your transaction, your view is guaranteed to be consistent.
>
>If you want to guarantee that Client2 sees all relevant data and that no more
>can be added while Client2 is operating, then you need to get an exclusive
>write lock on the table. Of course this can kill your performance with
>multiple updating clients.
>
>Phew! That was longer than I was expecting. Does it make it any clearer?
>Concurrency issues can get involved - there are books and university courses
>that just deal with this one topic. Hopefully I haven't got anything wrong
>above. Oh - the description of "candidate list" stuff above isn't necessarily
>precisely the way that PG does it, but that's how I think of it.
>
>HTH
>
>
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Rolf Jentsch 2003-09-11 07:33:42 Re: help with TCL function
Previous Message H A Prahalad 2003-09-11 07:19:52 PostgreSQL for AMD64