powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как смоделировать deadlock detected ?
12 сообщений из 12, страница 1 из 1
как смоделировать deadlock detected ?
    #38955278
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
периодически проскакивают deadlock detected

но я не понимаю почему.
а пока не пойму, не смогу вылечить....

подскажите какой нибудь простой пример как можно смоделировать эту ситуацию, чтоб появился deadlock detected.
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955299
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kkv79периодически проскакивают deadlock detected
но я не понимаю почему.
а пока не пойму, не смогу вылечить....

А в чём проблема-то? Если Вы их обрабатываете и их не слишком много, то всё хорошо.

kkv79подскажите какой нибудь простой пример как можно смоделировать эту ситуацию, чтоб появился deadlock detected.
Нда. http://lmgtfy.com/?q=Deadlocks in PostgreSQL site:stackoverflow.com
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955641
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня получилось воспроизвести deadlock detected
по умолчанию стоит deadlock_timeout=1s
поставил
deadlock_timeout=10s

всё равно выскочил deadlock detected, но только на 10 секунд позже.
т.е. увеличив этот параметр, я не избавился от deadlock detected, а только увеличил тупняк базы...

для чего тогда нужен параметр deadlock_timeout, если он делает только хуже?
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955659
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79,

чтобы дятел в своем приложении (в менее важной ветке) успел сам отказаться от вызвавшего дедлок стейтмента, а не отдавать на откуп СУБД решение , какую из 2-х веток рубить. Но это сложно -- читать самому дерево блокировок, самому вычислять дедлоки, самому предлагать пользователю откатить транзакцию [или её фрагмент до сейвпойнта]. Гораздо проще правильно обрабатывать ошибку на клиенте. И ставить таймаут в минимум.


т.е. делок -- это ситуация, не разрешимая без внешнего вмешательства . СУБД предлагает вам сервис по разрешению, снятием одного из конкурирующих за ресурсы (обычно -- в скрест) 2-х потоков команд. До тех пор пока вы не научитесь вмешиваться сами (и у вас не появиться тяга к обильному hand-job-у) -- полжитесь на этот сервис.
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955662
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79,

этот параметр нужен не для того чтобы исправить проблему. процедура поиска deadlock'ов ресурсоемкая, поэтому нужен этот параметр чтобы его в каких-то определенных случаях уменьшить можно было.

в логах постгреса должно быть видно запросы/транзакции которые вызвали deadlock, от них и нужно исходить.

скорее всего у вас либо в разных транзакциях обновляются одни и те же строки, но в разном порядке либо блокируются одни и те же строки в разных таблицах в разном порядке.

решение простое - нужно либо обновлять (или брать блокировки) в одном порядке либо не обновлять одновременно.
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955796
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqkkv79,

чтобы дятел в своем приложении (в менее важной ветке) успел сам отказаться от вызвавшего дедлок стейтмента, а не отдавать на откуп СУБД решение , какую из 2-х веток рубить. Но это сложно -- читать самому дерево блокировок, самому вычислять дедлоки, самому предлагать пользователю откатить транзакцию [или её фрагмент до сейвпойнта]. Гораздо проще правильно обрабатывать ошибку на клиенте. И ставить таймаут в минимум.


т.е. делок -- это ситуация, не разрешимая без внешнего вмешательства . СУБД предлагает вам сервис по разрешению, снятием одного из конкурирующих за ресурсы (обычно -- в скрест) 2-х потоков команд. До тех пор пока вы не научитесь вмешиваться сами (и у вас не появиться тяга к обильному hand-job-у) -- полжитесь на этот сервис.

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

дак вот именно он (тикер), периодически дэдлочится с другими более важными апдэйтами.
получается, нужно выставить deadlock_timeout=3s например.
и замерять время выполнения данной транзакции (тикера)
и если вдруг, транзакция не завершилась за 3 сек. то отменить её, т.к. она менее важная, чем поступившие данные от клиента.
я правильно понял?
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955849
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79,

“Полезный триггер” изменяет записи в таблицах в порядке, отличном от такового в “более важных апдейтах”, при этом изменить нужно одни и те же таблицы.

Меняя время вы ничего не измените:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
А: UPDATE a ... WHERE id=100;
Б: UPDATE z ... WHERE id=200;
А: <другие действия в рамках транзакции>
Б: <также другие действия>
А: UPDATE z ... WHERE id=200; >>>надо ждать пока Б закончит транзакцию<<<
Б: UPDATE a ... WHERE id=100; >>>надо ждать пока А закончит транзакцию<<<
Deadlock detected.

Увеличивая параметр вы просто увеличиваете время, пока база не вмешается.
Нужно пересмотреть подход к изменению данных. Самое простое — пересмотреть все `UPDATE` транзакции и обеспечить изменение таблиц в определенном порядке, скажем в алфавитном.

На практике бывает весьма не просто...
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955872
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kkv79у меня есть тикер, который раз в секунду обновляет поле в одной из таблиц, а дальше триггер на этом поле, делает кучу полезных вещей, необходимых для функционирования системы.

дак вот именно он (тикер), периодически дэдлочится с другими более важными апдэйтами.
получается, нужно выставить deadlock_timeout=3s например.
и замерять время выполнения данной транзакции (тикера)
и если вдруг, транзакция не завершилась за 3 сек. то отменить её, т.к. она менее важная, чем поступившие данные от клиента.
я правильно понял?
Нет, ну вообще это вариант, конечно, но похожий на перематывание скотчем. ;)
Кстати, Вы уверены, что знаете, как это реализовать?
Короче, как временная мера пойдёт, а вообще послушали бы Вы Alexius и vyegorov...
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955940
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[/quot]
Нет, ну вообще это вариант, конечно, но похожий на перематывание скотчем. ;)
Кстати, Вы уверены, что знаете, как это реализовать?
Короче, как временная мера пойдёт, а вообще послушали бы Вы Alexius и vyegorov...[/quot]

получилось.

поставил для тикера таймаут транзакции 2 сек.
а deadlock_timeout=2100

дэдлоки пропали и появились
Код: plaintext
2015-05-11 20:57:47 MSK ERROR:  canceling statement due to user request
но это уже намного лучше чем было....
теперь хоть пользовательские данные не пропадают.
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955948
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79,

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

Как администратор стороннего софта, я предпочел бы как можно быстрее эскалировать проблему разработчику, собрав все участвующие в дэдлоке запросы, частоту дэдлоков и мое видение на то, как проблему решать. Т.к. в противном случае, если “прорвет” где-то еще, то прийдут ко мне и спросят. И будут правы.
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955965
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79получилось.

поставил для тикера таймаут транзакции 2 сек.
а deadlock_timeout=2100

дэдлоки пропали и появились
Код: plaintext
2015-05-11 20:57:47 MSK ERROR:  canceling statement due to user request
но это уже намного лучше чем было....
теперь хоть пользовательские данные не пропадают.

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

и , пока вы не разобрались с этим моментом, -- ваше решение вполне имеет право на жизнь. хотя оно и не столь хорошо, как предлагаемая vyegorov альтернатива
...
Рейтинг: 0 / 0
как смоделировать deadlock detected ?
    #38955966
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovkkv79,

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

Как администратор стороннего софта, я предпочел бы как можно быстрее эскалировать проблему разработчику, собрав все участвующие в дэдлоке запросы, частоту дэдлоков и мое видение на то, как проблему решать. Т.к. в противном случае, если “прорвет” где-то еще, то прийдут ко мне и спросят. И будут правы.


сейчас как раз занимаюсь разбором запросов вызывающих блокировки....
уже кое что даже нашёл и поправил ))
теперь я полностью понял как они появляются и как их лечить....
спасибо за помощь.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как смоделировать deadlock detected ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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