|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
1 сессия2 сессия Код: sql 1. 2.
Код: sql 1. 2.
Код: sql 1. 2. 3. 4.
Код: sql 1.
Ожидается, что select во 2 сессии покажет 5 записей, но в реальности показывается 0 записей ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 20:49 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
Dany305, А какая версия ПЖ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 20:52 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
PostgreSQL 9.3.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 21:06 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
Dany305, в 9.6.1. то же самое. он таки протекает. но течет, как и предполагалось, по ddl. --даже не создавая новую foo вы получите ошибку попытавшись обратиться к foo сразу после дропа в 1 надо смотреть на 'foo'::regclass::oid -- тогда сразу видно, на что вы смотрите. мораль -- в рипитебле не стоит пользоваться тем, что может быть дропнуто / криейтнуто конкурентами до первого обращения из рипитебла. если же в рипитебле сразу почитать из что--то из foo -- то будет лок таблички, и в параллельной сессии образуется честная очередь на дроп. в общем с транзакционным ддл одни расстройства, из-за того, что они его реализовали именно и только как рид--коммитед . во всех других уровнях изоляции он течет. и сталобыть отчеты надо варить как--то обходя этот факт. что крайне осложняет жизнь. (в т.ч. если за время варки отчета дропнется какая-нито партиечка, какую хотели но не успели опросить) печаль ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 21:47 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
qwwq, попробовать: в транзакции, в которой рипитебл нужно сразу обратиться ко всем объектам из которых собираетесь (в дальнейшем) что--то читать. (и только потом начинать считать отчёты). как результат -- все остальные встанут в очередь при попытках ddl в них над этими объектами. т.е всё возможно встанет колом, но рипитебл будет честным. иначе -- надо лочить вообще любой ддл ,пока крутится хоть одна рипитбл транза. попробовать: -- прочитать все нужные имена из pg_class . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 21:59 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
qwwqDany305, в 9.6.1. то же самое. он таки протекает. но течет, как и предполагалось, по ddl. Да уж… Девелоперы же сделали MVCC поддержку для каталога (раньше был снепшотный). Судя по всему, кроме самого MVCC, ничего не поменяли... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 22:08 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
vyegorov, ничего страшного 1. открываем рипитебл. 2. первым предложением читаем из всех объектов (или кладём лок на строки pg_class всех объектов, которые собрались опрашивать) 3. начинаем считать. (т.н. профит) а иначе с транзакционным ддл кажется трудно совместить другие уровни изоляции. чисто теоретически, не лоча все записи пж-класса -- кто ж его, знает, куда, открыв уровень изоляции выше коммитеда, вы соберётесь в ней наобращаццо ? или есть идеи, как иметь несколько не только версий строк (в том же пж_класс), но и версий таблиц одновременно, не лоча ддл ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 22:21 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
qwwqили есть идеи, как иметь несколько не только версий строк (в том же пж_класс), но и версий таблиц одновременно, не лоча ддл ? В данном случае, DROP/CREATE приводит к тому, что в `pg_class` происходит DELETE/INSERT записей. Соответственно, если сама `pg_class` защищена MVCC, то разницы быть не должно — первая сессия (которая пересоздала таблицу) видит уже новую версию в `pg_class`, REPEATABLE READ сессия видит прежнюю в соответствии с правилами MVCC. Но я согласен — это ящик пандоры. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 22:37 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
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 , ддл которого закомиченно последним (т.е. для ддл уровень изоляции всегда "коммитед" ) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 22:50 |
|
Протекающий REPEATABLE READ
|
|||
---|---|---|---|
#18+
qwwqтам кажись select 'foo'::regclass::oid отличается от select oid from pg_class where relname='foo'; это забавное следствие того ,что для select oid from pg_class действует текущий уровень изоляции, а для select * from foo; --- foo, это то foo , ддл которого закомиченно последним (т.е. для ддл уровень изоляции всегда "коммитед" ) Угу, они не переделали то, каким образом сессии работают с каталогом, т.е. по прежнему используются сигналы инвалидации кэша каталога. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2017, 23:14 |
|
|
start [/forum/topic.php?fid=53&fpage=76&tid=1996627]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 344ms |
total: | 463ms |
0 / 0 |