Re: SELECT ... FOR UPDATE performance costs? alternatives?

Поиск
Список
Период
Сортировка
От btober@ct.metrocast.net
Тема Re: SELECT ... FOR UPDATE performance costs? alternatives?
Дата
Msg-id 46C3567B.6070804@ct.metrocast.net
обсуждение исходный текст
Ответ на Re: SELECT ... FOR UPDATE performance costs? alternatives?  (Erik Jones <erik@myemma.com>)
Ответы Re: SELECT ... FOR UPDATE performance costs? alternatives?  (Erik Jones <erik@myemma.com>)
Список pgsql-general
Erik Jones wrote:
> On Aug 15, 2007, at 1:09 PM, D. Dante Lorenso wrote:
>
>> ...to ensure that only one server is processing the queue item, so
>> inside PGSQL, use SELECT ... FOR UPDATE to lock the row...
>>
>> When my server is under severe load, however, this function begins to
>> take a long time to execute and I begin to suspect that the FOR
>> UPDATE lock might be locking the whole table and not just the row.
>> How do I know if this is the case, how can I optimize this procedure,
>> and how should I be doing this differently?  ...
>>
>> Thoughts?
>
> SELECT ... FOR UPDATE should only be locking the rows returned by your
> the select statement, in this case the one row.  You can check what
> locks exist on a table (and their type) with the pg_locks system view.
>

Is that correct? Documentation section 12.3.1. Table-Level Locks states
'The list below shows the available lock modes ...Remember that all of
these lock modes are table-level locks, even if the name contains the
word "row"'.

I wonder why bother with the SELECT statement at all. Why not just go
straight to the UPDATE statement with something like

    UPDATE queue SET
      status = in_new_status,
      ts_start = NOW(),
      ts_end = NULL,
      hostname = COALESCE(in_hostname, hostname)
    WHERE tcq_id = (SELECT tcq_id  FROM queue q WHERE q.status =
in_status ORDER BY tcq_id ASC LIMIT 1);

He may need to trap an exception for the "not found" case, but what's
the big deal with that?

UPDATE statements acquire a ROW EXCLUSIVE on the table, which conflicts,
among other things, with ROW EXCLUSIVE, so it will block other UPDATE
statements initiated by other transactions.



В списке pgsql-general по дате отправления:

Предыдущее
От: Erik Jones
Дата:
Сообщение: Re: SELECT ... FOR UPDATE performance costs? alternatives?
Следующее
От: "A.M."
Дата:
Сообщение: Re: User-Friendly TimeZone List