Re: Not understanding this behavior of a subselect + volatile function

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Not understanding this behavior of a subselect + volatile function
Дата
Msg-id 8680.1338084481@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Not understanding this behavior of a subselect + volatile function  (Brian Palmer <brian@codekitchen.net>)
Ответы Re: Not understanding this behavior of a subselect + volatile function  (Brian Palmer <brian@codekitchen.net>)
Список pgsql-general
Brian Palmer <brian@codekitchen.net> writes:
> The final line, the select, will return the row as it was before the
> function ran, (1,0) instead of (1,1).  It's as if the outer select
> locked its view of the table in place before the inner select ran.

Yes, that's exactly correct.  A plain SELECT always returns data that is
visible as of its "snapshot", ignoring anything that happened later ---
even volatile functions executing in the same transaction.

> What seems even stranger to me is that if a row is inserted at just the right moment, the inner function can select
itand update it, then return its primary key, but the outer select won't even see that row, and so it will return 0
rowseven though the row got updated. 

Volatile functions have their own snapshot that is independent of the
calling query's.  So it's definitely possible for a volatile function to
"see" a row that was committed just after the outer select took its
snapshot.  That row cannot be seen by the outer query, though.

You can tweak these rules to some extent by using SELECT FOR UPDATE
and different transaction isolation modes.  See the "concurrency
control" chapter in the manual.

            regards, tom lane

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

Предыдущее
От: Brian Palmer
Дата:
Сообщение: Re: Not understanding this behavior of a subselect + volatile function
Следующее
От: Brian Palmer
Дата:
Сообщение: Re: Not understanding this behavior of a subselect + volatile function