|
|
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
//в частности к знатокам лондайста. -- есть ли какие-то гарантии того, в каком порядке обрабатываются [ и будут и далее] события записей внутри транзакции ? вводная : 1. есть триггер записи событий, висит на after insert|update|delete каждой записи. генерит [, кроме записи txid_current()], еще и nextval в ev_id (как в pgq.event примерно) -- идея банальная -- писать события, и обрабатывать в месте назначении в подходящем порядке [пока не уточняем, в каком]. теперь генерю тестовый батч "событий" Код: sql 1. 2. и вижу -- последними 100 за ev_id пришли обработки события удаления строки (СТЕ-стейтмента), а не вставки строк (того же СТЕ --стейтмента). -- вот тут то и возникает вопрос, об опущенном выше "подходящем порядке". PS Вспоминается -- у лондайста[3-го] триггера фиксации событий по умолчанию срабатывают в after [, но есть опция -- перенести триггер на событие before]. А порядок реплицирующих стейтментов внутри батча -- кажется только по ev_id [pgq.batch_event_sql()] . Как они выкручиваются, в свете вышесказанного? кто-нть разбирался ? Или там таки будет дырка ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2015, 14:32 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
"и вижу -- последними 100 за ev_id пришли обработки события удаления строки (СТЕ-стейтмента), а не вставки строк (того же СТЕ --стейтмента). " ну так может из-за returning? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2015, 14:57 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Winnipuh"и вижу -- последними 100 за ev_id пришли обработки события удаления строки (СТЕ-стейтмента), а не вставки строк (того же СТЕ --стейтмента). " ну так может из-за returning? нежданчик в том, что интуиция о том, что триггера "на запись" отработают (внутри одной и той же транзакции!) в том же порядке. в каком потом "события записи" можно будет накатить на реплику -- разрушается таким вот поведением CTE. Или в лондайсте это как-то преодолевается, или реализатор именно такой отработки CTE был вредителем из конкурирующей команды "слони" (кстати как там реализована логика -- ещё надо посмотреть) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2015, 15:43 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
план надо смотреть -- станет всё понятно, возможны два варианта: ddddd...iiiii... , didididi.... . но, в любом случае, делит конкретной "строки" будет перед её "следующим" инсертом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2015, 23:45 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurinплан надо смотреть -- станет всё понятно, возможны два варианта: ddddd...iiiii... , didididi.... . но, в любом случае, делит конкретной "строки" будет перед её "следующим" инсертом."если факты не ложатся в теорию -- тем хуже для фактов" я намерил то что намерил -- сначала за сиквеносм заходят 100 инсертов, потом 100 дилетов. но никаких виолейшенов не наблюдается. пичалька надо, кстати, напрячь стандартный лондайст -- посмотреть, что с ним будет я-то выкрутился -- у меня еще и версии записей есть, я просто все замерджил на вставке, и делеты с учетом старшинства версий повесил. за счет мерджа (там на деле партицированный таргет) просел на порядок -- надо что-то придумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 08:29 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
авторя намерил то что намерил -- сначала за сиквеносм заходят 100 инсертов, потом 100 дилетов где воспроизводимый код? так не может быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 13:59 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurinавторя намерил то что намерил -- сначала за сиквеносм заходят 100 инсертов, потом 100 дилетов где воспроизводимый код? так не может быть я тоже сильно обиделся, когда увидел. а воспроизводимый код -- 2 таблицы (данные + ивенты), один триггер регистрации ивентов, на все события, after -- лениво пока. вы же понимаете, что универсальная кухня обвешана кучей лишнего, не нужного для тест--кейса. а создавать выделенный простой случай -- лениво. У вас под руками лондайст. в нем уже есть pgq.events_i_k -- и триггера публикации. попробуйте удалить и сразу вставить пачку в какой-то ненужной табличке, результат смотрите в pgq.events_i_k [order by ev_id] отпишитесь. если будет что писать (оно таки сдохнет) -- будет интересно -- а не будет -- будет интересно выяснить, почему оно так, а не этак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 14:37 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
всё много раз поверенно, возможны два варианта: 1) didididi... 2) dddd... iiii... варианта iiiiii dddd не может быть. вот тут можно проверять Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 16:06 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin<> варианта iiiiii dddd не может быть. <> в вашем кейсе у меня didi но тем не менее в моем: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. -- т.е. быть то он может т.е. суслик, битым словом, есть. уже интересно. осталось повторить в железе, удалив всё ненужное. у меня правда таблица партицирована. триггера партицирования -- BEFORE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 17:02 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
а может дело и не в триггерах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 17:08 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, ага, удалось: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 17:12 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
не смотрел пока. дело точно не в asc/desc? у меня select * from tmp.test_trg_log order by ev_id у вас select * from tmp.test_trg_log order by ev_id DESC; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 17:45 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, дело в эмуляции партицирования. И запросе к "голове" а не к "партиции". т.е. сухой остаток -- "они такие бывают", а как их сгенерировать -- дело техники. т.е. основополагающая интуиция велосипедов бывает неверна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2015, 17:52 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq, Здесь вот какое дело. Триггер test_trg, который регистрирует события, объявлен как AFTER FOR EACH ROW. Как известно, такие триггера срабатывают в конце работы всего оператора (в данном случае DELETE ... INSERT), уже после того, как все строки будут обработаны. Строки, действительно, обрабатываются в правильном порядке: сначала DELETE, затем INSERT. Но гарантии, что after row триггера будут срабатывать именно в таком же порядке документация вообще-то не дает. Если заменить этот триггер на before for each row, то события будут регистрироваться в правильном порядке. drop schema tmp cascade; CREATE schema tmp; create table tmp.test_trg_0( id serial primary key, tag text ); create table tmp.test_trg( LIKE tmp.test_trg_0 INCLUDING ALl ) INHERITS (tmp.test_trg_0); create table tmp.test_trg_log( ev_id serial primary key, txid bigint default txid_current(), xdata text ); /* create or replace function tmp.test_trg_func() returns trigger language 'plpgsql' as $$ begin insert into tmp.test_trg_log ( xdata ) values ( TG_OP ); return null; end; $$; create trigger test_trg after insert or update or delete on tmp.test_trg for row execute procedure tmp.test_trg_func(); */ create or replace function tmp.test_trg2_func() returns trigger language 'plpgsql' as $$ begin insert into tmp.test_trg SELECT NEW.*; return null; end; $$; create trigger test2_trg BEFORE insert on tmp.test_trg_0 for EACH row execute procedure tmp.test_trg2_func(); create or replace function tmp.test_trg3_func() returns trigger language 'plpgsql' as $$ begin insert into tmp.test_trg_log ( xdata ) values ( TG_OP ); if TG_OP IN ('INSERT', 'UPDATE') then return NEW; elsif TG_OP = 'DELETE' then return OLD; end if; end; $$; create trigger test_trg3 before insert or update or delete on tmp.test_trg for row execute procedure tmp.test_trg3_func(); insert into tmp.test_trg_0 values (1, '1'); TRUNCATE tmp.test_trg_log; with del as ( delete from tmp.test_trg_0 t where t.id = 1 returning t.* ) insert into tmp.test_trg_0 select * from del ; select * from tmp.test_trg_log order by ev_id DESC; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 11:15 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Павел Лузанов, это хорошо, про костылик. но "тут вот какое дело" : в небезысвестном лондайсте триггера записи событий по умолчанию ставятся именно на афтырь: Код: sql 1. 2. 3. 4. 5. а с другой стороны [пока не доказано иное] -- внутри батча там вовсю используется описанная выше интуиция. представляющаяся, при отсутствии опыта наблюдения предложенного тут парадокса, безусловно верной. данным стулом матер гамбс забил крышку в гроб этого сильного предположения, только и всего. (т.е. контрпример опровергает интуицию целиком, а про--пример -- есть всего лишь частный случай костыляния) то, что существуют местные костылики, что-то частично правящие в конкретных случаях -- слабое утешение. ибо велосипедики позиционируются как относительно универсальные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 11:54 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq, Я так и думал, что after row триггер создает лондайст, с которым мне не доводилось иметь дело. Пока это выглядит как баг именно в лондайсте. А вообще пример очень интересный, отдельное спасибо за тест кейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:05 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq<> данным стулом матер гамбс забил крышку в гроб этого сильного предположения <>вот что бывает когда делаешь одно, пишешь другое, и правишь фрактально -- со всех мест во все стороны. явный образчик шизофазии. авторданным стулом матер гамбс забил костыль в крышку гроба этого <далее по тексту> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:08 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Павел Лузановqwwq, Я так и думал, что after row триггер создает лондайст, с которым мне не доводилось иметь дело. Пока это выглядит как баг именно в лондайсте. А вообще пример очень интересный, отдельное спасибо за тест кейс.я не думаю, что это лондайст--специфично. К тому же триггера на бефоре имеют полное право налететь на проблему как того же (никто ничего не гарантирует) , так и другого характера. -- а именно перехватить "данные" так по факту и не попавшие никуда (событие, отмененное позже). Я этим кое--где пользуюсь , т.к. лондайст позволяет повесить и триггера before, можно "реплицировать" виртуальную вставку. И да, я лепил нечто своё, по мотивам -- и налетел. Т.е. проблема не в лондайсте, проблема в интуиции. А на лондайсте я этот вычурный случай и не проверял. Может быть там таки есть какое волшебное слово от сглаза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:18 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq, триггера на бефоре имеют полное право налететь на проблему как того же (никто ничего не гарантирует) Ну не знаю. Про before row документировано, что: Row-level BEFORE triggers fire immediately before a particular row is operated on... так и другого характера. -- а именно перехватить "данные" так по факту и не попавшие никуда (событие, отмененное позже). Но если транзакция будет прервана, то произойдет откат всех изменений, в том числе и сделанных триггером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:34 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Павел Лузановqwwq, <>так и другого характера. -- а именно перехватить "данные" так по факту и не попавшие никуда (событие, отмененное позже). Но если транзакция будет прервана, то произойдет откат всех изменений, в том числе и сделанных триггером. "вы не поняли"(сс) -- транзакция не будет откачена. просто найдётся ещё один триггер с винтом, делающий [иногда] return null; и именуемый в алфавитной сортировке более отложенным именем. Что я в принципе и упоминал выше, как репликацию виртуальной вставки. или примитивно меняющий поля триггер, но позже "фиксирующего события". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:41 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq, Убедительно, согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 12:44 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
бррррр ... во херота) надо еще смотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2015, 17:34 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
[GENERAL] writable cte triggers reverse order написал в рассылку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2015, 00:20 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, в спортлото написали ? тут павел прав -- это не проблема постгреса, а проблема использования негодной интуиции, как минимум -- в порядко--зависимой after логике. Видимо (если понимать цитату павла в буквальном смысле) -- для before логики это проблемы нет, и это даже, вероятно, строго доказуемо. (нужны детали о принципах реализации [чтобы умозаключать об "интегралах движения"] -- т.ч. не буду утверждать) т.е. писать надо тем, кто использует неверную логическую посылку. (а я пока не выяснял дотошно -- есть ли достоверно такие, кроме меня). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2015, 10:29 |
|
||
|
пятничный псто о порядке "событий" записей стейтмента
|
|||
|---|---|---|---|
|
#18+
qwwq, Кстати, ты правильно отмечал, что здесь замешано partitioning. До тех пор, пока была обычная таблица, after row триггера для with delete ... insert работали в ожидаемом порядке (Мишин пример). Как только таблица стала секционированной - ситуация поменялась. А что изменилось. Изменилось, что delete добирается до искомой таблицы через наследование, а insert через триггер, разруливающий вставку в нужные секции. Вот где-то в этом месте порядок и сломался. Но, как я и писал ранее, его никто и не гарантировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2015, 14:40 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38986575&tid=1997921]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 437ms |

| 0 / 0 |
