Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
собственно, вот код взятый из доки по Pg Код: plaintext 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. Вопрос, зачем все это делается в цикле? Каким образом он вообще может отработать в цикле, как я понимаю пытаемся проделать update, если не получилось делаем insert, как он может сгенерить ошибку unique_violation, если update перед ним не отработал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 14:20 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Ia tak ponimau, chto eto delaetsia radi ispolzovania metki. Tak kak v chistom PL/pgSQL metok net. A u tsiklov est' metki v kontse. A otlov oshibki unique_violation tut toje po delu stoit. Na sluchai esli pervyy UPDATE zavershitsia s takoi oshibkoi -- delo v tom chto etot otlov oshibki otnositsia NE k poslednemu INSERT'u, a ko vsemu bloku! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 15:40 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
блок exception является необязательной частью блока begin end; и в данном случае обрабатывает некорректный инсерт. а насчет того, откуда исключение, так ведь этот код может работать в нескольких сессиях. Между update и insert может произойти вставка в другой сессии с таким же delta_time_key ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 15:43 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
ДрагаВопрос, зачем все это делается в цикле? СергейК...Tak kak v chistom PL/pgSQL metok net. A u tsiklov est' metki v kontse... Я понимаю так: чтобы изменения применились в любом случае. Метки тут ни при чём. Предполагается, что возможен вариант: * в момент апдейта там небыло такого объекта (с таким ключём), * а перед тем как интсертиться он уже появился (где-то паралельно успелось вставиться); - но при этом надо в любом случае произветси либо вставку, либо апдейт * тогда по циклу переходим снова на апдейт и т. д. пока либо не проапдейтим, либо не вставим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 09:28 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin Я понимаю так: чтобы изменения применились в любом случае. Метки тут ни при чём. Предполагается, что возможен вариант: * в момент апдейта там небыло такого объекта (с таким ключём), * а перед тем как интсертиться он уже появился (где-то паралельно успелось вставиться); - но при этом надо в любом случае произветси либо вставку, либо апдейт * тогда по циклу переходим снова на апдейт и т. д. пока либо не проапдейтим, либо не вставим.наскоко я понимаю, это код на PL/pgSQL , т.е. он весь унутре одной процедуры ==> одной транзакции. Не подскажите, какой должен быть установлен уровень изоляции, чтобы разные стейтменты внутри транзакции (вернее - одни и те же, но в разное время) видели разные данные, измененные другими транзакциями за время отработки текущей. А в каком случае транзакция вывалится по бесконечному цыклу (и вывалится ли). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 10:43 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Если уровень не Serializable, то разные операторы одной транзакции вполне могут увидеть разные данные, которая зафиксировала другая транзакция. или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:08 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Код триггера в первом посте взят из http://developer.postgresql.org/pgdocs/postgres/plpgsql-trigger.html Создаем таблицы и триггер, запускаем две консоли psql (#1, #2) (PostgreSQL 8.1.4 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:15 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
st_sergЕсли уровень не Serializable, то разные операторы одной транзакции вполне могут увидеть разные данные, которая зафиксировала другая транзакция. или я не прав?Вы правы. Особо, если учесть что единственным уровнем кроме Serializable в посгре является READ COMMITTED (умолчательный). однако, поскольку мы (кажется) не можем (или я не прав?) порулить уровнем изоляции внутри процедуры (в данном случае - триггерной) - т.к. она заведомо выполняется внутри вызвавшей транзакции, то данное решение не устойчиво относительно выбора уровня изоляции (применив данное решение мы отказываем себе в удовольствии выполнять что-либо, затрагивающее данный триггер в режиме Serializable. Т.к. при конкуренции, приведшей к закольцовыванию цыкла, транзакция кажется повиснет в вечном лупе. Или таки вывалится с эксепшеном (что вряд ли - это ж не рекурсия, где ресурсы исчерпываются приводя к явной ошибке, а обычный цыкл) и ее придется рубить снаружи? Нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:31 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:35 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
st_serg Код: plaintext 1. 2. 3. 4. 1/ на пустых таблицах: ERROR: out of memory DETAIL: Failed on request of size 20. CONTEXT: SQL statement "UPDATE sales_summary_bytime SET amount_sold = amount_sold + $1 , units_sold = units_sold + $2 , amount_cost = amount_cost + $3 WHERE time_key = $4 " PL/pgSQL function "maint_sales_summary_bytime" line 43 at SQL statement 2/ на имеющих записи ERROR: could not serialize access due to concurrent update CONTEXT: SQL statement "UPDATE sales_summary_bytime SET amount_sold = amount_sold + $1 , units_sold = units_sold + $2 , amount_cost = amount_cost + $3 WHERE time_key = $4 " PL/pgSQL function "maint_sales_summary_bytime" line 43 at SQL statement ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:50 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
а версия пг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:51 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
ага, сори, мой косяк ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:57 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
st_sergа версия пг? Код: plaintext зы. про пг 8.2.0 было что-то непотребное сказано на сравнении БД. Про сложные запросы. Как у вас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 12:58 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Код действительно взять из триггерной функции, забыл указать. Вопрос, по крайней мере для меня, так и остался не проясненным. Этот код - руководство к действию и правильно писать именно так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 13:05 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
я работаю с oracle, а за пг просто наблюдаю, интересно... так что про сложные запросы ничего сказать не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 13:05 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
ДрагаКод действительно взять из триггерной функции, забыл указать. Вопрос, по крайней мере для меня, так и остался не проясненным. Этот код - руководство к действию и правильно писать именно так? на уровне изоляции serializable этот код не всегда будет работать в триггерной функции поменяйте блок Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 13:18 |
|
||
|
вопрос по самообразованию
|
|||
|---|---|---|---|
|
#18+
Драга Этот код - руководство к действию и правильно писать именно так? учитывая скрытые неприятные "сюрпризы" с этим кодом, которые проявляются при определенных условиях (хоть возможно и маловероятных), можно, например, добавить счетчик неуспешных проходов цикла и отваливаться с exception по превышению допустимого числа попыток :) btw, решить часть проблем с UPDATE or INSERT в режиме SERIALIZABLE могут явные блокировки таблиц на время транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 14:23 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2005863]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
4ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 437ms |

| 0 / 0 |
