|
|
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
Лог ошибки автор2015-10-15 10:56:35 YEKT [30487-2] gottlieb@gottlieb DETAIL: Process 30487 waits for ShareLock on transaction 33423231; blocked by process 13160. Process 13160 waits for ShareLock on transaction 33423251; blocked by process 30487. Process 30487: UPDATE snmp_ports SET oper = 2, admin = 1 WHERE id = 42251 Process 13160: DELETE FROM equipment_ids WHERE equipment_ids.id = 1986 2015-10-15 10:56:35 YEKT [30487-3] gottlieb@gottlieb HINT: See server log for query details. 2015-10-15 10:56:35 YEKT [30487-4] gottlieb@gottlieb CONTEXT: while locking tuple (246,56) in relation "equipment_ids" SQL statement "SELECT 1 FROM ONLY "public"."equipment_ids" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x" SQL statement "UPDATE snmp_ports SET flap_times=flap_times+1, last_down=now() WHERE id = OLD.id" PL/pgSQL function snmp_oper_update() line 7 at SQL statement 2015-10-15 10:56:35 YEKT [30487-5] gottlieb@gottlieb STATEMENT: UPDATE snmp_ports SET oper = 2, admin = 1 WHERE id = 42251 Краткое описание таблиц: Код: plsql 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. Процесс 30487 непрерывно делает апдейты таблицы snmp_ports. Частота где-то 1-3 апдейта в секунду. 3-5 раз в день запускается процесс 13160, который пытается выполнить DELETE FROM equipment_ids WHERE equipment_ids.id = 1986 и соответственно каскадно удаляет порты. Ошибка возникает тогда, когда в первом процесе апдейтится тот же порт, что должен быть удален во втором процессе. Однако, если удалить триггер, то всё работает нормально. Подскажите как можно избежать этой ошибки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 14:40 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
kalombo, на апдейт порта сначала блокировать эквипмент или апдейтить по одной строчке на транзакцию. и это... нафиг в триггере делать апдейт той же таблицы, только заради, чтобы он был after? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 15:05 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
p2. на апдейт порта сначала блокировать эквипмент Сделал так: Код: plsql 1. 2. 3. 4. 5. 6. 7. Вроде работает, спасибо. p2.или апдейтить по одной строчке на транзакцию. Тут не понял, что ты имеешь в виду, объясни пожалуйста. p2.и это... нафиг в триггере делать апдейт той же таблицы, только заради, чтобы он был after? А какие варианты возможны еще? Мне нужно считать сколько раз флапнул(поменялось состояние поля oper) порт. Мне кажется выносить этот триггер во все апдейты портов всего приложения нецелесообразно, я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 07:07 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
И еще, можно как-то сэмулировать эту ошибку с помощью psql? Я пробовал по-разному - не вышло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 07:24 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
kalomobp2.или апдейтить по одной строчке на транзакцию. Тут не понял, что ты имеешь в виду, объясни пожалуйста.понимание предполагает знакомство со сценариями, приводящими к дедлоку. Код: plsql 1. ну ты маханул... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 09:00 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
kalomboА какие варианты возможны еще? Мне нужно считать сколько раз флапнул(поменялось состояние поля oper) порт. Мне кажется выносить этот триггер во все апдейты портов всего приложения нецелесообразно, я не прав? да, апдейть flap_times сразу вместе с UPDATE snmp_ports SET oper = 2, admin = 1 !!!!! Однозначно лучше и быстрее и локов меньше. Не целесообразно городить тригеры, там где они не нужны. Это раз. А два - лочить всю таблицу стейтментов это вообще жестко. Лучше не начинай навешивать костылей - это путь в тупик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 10:03 |
|
||
|
Помогите разобраться с deadlock.
|
|||
|---|---|---|---|
|
#18+
Ivan DurakkalomboА какие варианты возможны еще? Мне нужно считать сколько раз флапнул(поменялось состояние поля oper) порт. Мне кажется выносить этот триггер во все апдейты портов всего приложения нецелесообразно, я не прав? да, апдейть flap_times сразу вместе с UPDATE snmp_ports SET oper = 2, admin = 1 !!!!! Однозначно лучше и быстрее и локов меньше. Не целесообразно городить тригеры, там где они не нужны. Это раз. А два - лочить всю таблицу стейтментов это вообще жестко. Лучше не начинай навешивать костылей - это путь в тупик. Сделал так, спасибо всем. Код: plsql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 12:32 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39078563&tid=1997712]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 489ms |

| 0 / 0 |
