powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Протекающий REPEATABLE READ
10 сообщений из 10, страница 1 из 1
Протекающий REPEATABLE READ
    #39428760
Dany305
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 сессия2 сессия
Код: sql
1.
2.
create table foo
as select * from generate_series(1, 5) id;

Код: sql
1.
2.
begin transaction isolation level repeatable read;
select txid_current();

Код: sql
1.
2.
3.
4.
drop table foo;

create table foo
as select * from generate_series(1, 10) id;

Код: sql
1.
select * from foo;




Ожидается, что select во 2 сессии покажет 5 записей,
но в реальности показывается 0 записей
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428764
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dany305,

А какая версия ПЖ?
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428778
Dany305
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostgreSQL 9.3.4
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428791
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dany305,

в 9.6.1. то же самое.
он таки протекает.
но течет, как и предполагалось, по ddl. --даже не создавая новую foo вы получите ошибку попытавшись обратиться к foo сразу после дропа в 1

надо смотреть на 'foo'::regclass::oid -- тогда сразу видно, на что вы смотрите.

мораль -- в рипитебле не стоит пользоваться тем, что может быть дропнуто / криейтнуто конкурентами до первого обращения из рипитебла.

если же в рипитебле сразу почитать из что--то из foo -- то будет лок таблички, и в параллельной сессии образуется честная очередь на дроп.

в общем с транзакционным ддл одни расстройства, из-за того, что они его реализовали именно и только как рид--коммитед . во всех других уровнях изоляции он течет. и сталобыть отчеты надо варить как--то обходя этот факт. что крайне осложняет жизнь.
(в т.ч. если за время варки отчета дропнется какая-нито партиечка, какую хотели но не успели опросить)
печаль
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428797
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

попробовать:
в транзакции, в которой рипитебл нужно сразу обратиться ко всем объектам из которых собираетесь (в дальнейшем) что--то читать. (и только потом начинать считать отчёты). как результат -- все остальные встанут в очередь при попытках ddl в них над этими объектами. т.е всё возможно встанет колом, но рипитебл будет честным. иначе -- надо лочить вообще любой ддл ,пока крутится хоть одна рипитбл транза.

попробовать:
-- прочитать все нужные имена из pg_class .
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428801
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqDany305,

в 9.6.1. то же самое.
он таки протекает.
но течет, как и предполагалось, по ddl.
Да уж…

Девелоперы же сделали MVCC поддержку для каталога (раньше был снепшотный).
Судя по всему, кроме самого MVCC, ничего не поменяли...
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428810
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

ничего страшного
1. открываем рипитебл.
2. первым предложением читаем из всех объектов (или кладём лок на строки pg_class всех объектов, которые собрались опрашивать)
3. начинаем считать. (т.н. профит)

а иначе с транзакционным ддл кажется трудно совместить другие уровни изоляции. чисто теоретически, не лоча все записи пж-класса -- кто ж его, знает, куда, открыв уровень изоляции выше коммитеда, вы соберётесь в ней наобращаццо ?

или есть идеи, как иметь несколько не только версий строк (в том же пж_класс), но и версий таблиц одновременно, не лоча ддл ?
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428821
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqили есть идеи, как иметь несколько не только версий строк (в том же пж_класс), но и версий таблиц одновременно, не лоча ддл ?
В данном случае, DROP/CREATE приводит к тому, что в `pg_class` происходит DELETE/INSERT записей.
Соответственно, если сама `pg_class` защищена MVCC, то разницы быть не должно — первая сессия (которая пересоздала таблицу) видит уже новую версию в `pg_class`, REPEATABLE READ сессия видит прежнюю в соответствии с правилами MVCC.

Но я согласен — это ящик пандоры.
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428823
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovqwwqили есть идеи, как иметь несколько не только версий строк (в том же пж_класс), но и версий таблиц одновременно, не лоча ддл ?
В данном случае, DROP/CREATE приводит к тому, что в `pg_class` происходит DELETE/INSERT записей.
Соответственно, если сама `pg_class` защищена MVCC, то разницы быть не должно — первая сессия (которая пересоздала таблицу) видит уже новую версию в `pg_class`, REPEATABLE READ сессия видит прежнюю в соответствии с правилами MVCC.

Но я согласен — это ящик пандоры.
там кажись select 'foo'::regclass::oid отличается от select oid from pg_class where relname='foo'; это забавное следствие того ,что для select oid from pg_class действует текущий уровень изоляции, а для select * from foo; --- foo, это то foo , ддл которого закомиченно последним (т.е. для ддл уровень изоляции всегда "коммитед" )
...
Рейтинг: 0 / 0
Протекающий REPEATABLE READ
    #39428831
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqтам кажись select 'foo'::regclass::oid отличается от select oid from pg_class where relname='foo'; это забавное следствие того ,что для select oid from pg_class действует текущий уровень изоляции, а для select * from foo; --- foo, это то foo , ддл которого закомиченно последним (т.е. для ддл уровень изоляции всегда "коммитед" )
Угу, они не переделали то, каким образом сессии работают с каталогом, т.е. по прежнему используются сигналы инвалидации кэша каталога.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Протекающий REPEATABLE READ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]