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

вот что удалось получить с помощью админа из логов бд
cat /var/log/postgresql/postgresql-9.3-main.log|grep 5345
2014-02-17 12:30:41 MSK ПОДРОБНОСТИ: Процесс 5345 ожидает в режиме ShareLock блокировку "транзакция 191878859"; заблокирован процессом 19088.
Процесс 19088 ожидает в режиме ShareLock блокировку "транзакция 191878687"; заблокирован процессом 5345.
Процесс 5345: UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;

cat /var/log/postgresql/postgresql-9.3-main.log|grep 19088
2014-02-17 12:30:41 MSK ПОДРОБНОСТИ: Процесс 5345 ожидает в режиме ShareLock блокировку "транзакция 191878859"; заблокирован процессом 19088.
Процесс 19088 ожидает в режиме ShareLock блокировку "транзакция 191878687"; заблокирован процессом 5345.
Процесс 19088: UPDATE sessions SET serverid=-1 WHERE sessionid=6241090;



в игровом сервере 16 потоков каждый из которых может выполнять sql запрос ( у каждого потока свой независимый коннект к бд )
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565234
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну для начала надо запустить так:
Код: sql
1.
cat /var/log/postgresql/postgresql-9.3-main.log|grep -a5 -b5 5345

Что-бы окружение увидеть...
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565325
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orfelin,

приведите полные логи этих транзакций зависших, что они еще делали, до того как встали. есть ли у вас триггера там, форейнкеи?
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565594
orfelin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
cat /var/log/postgresql/postgresql-9.3-main.log|grep -a5 -b5 5345
3185-2014-02-17 12:29:56 MSK ПОДСКАЗКА:  Подробности запроса смотрите в протоколе сервера.
3323-2014-02-17 12:29:56 MSK ОПЕРАТОР:  UPDATE sessions SET serverid=-1 WHERE sessionid=6241075;
3423-                                                                           UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241075;
3524-2014-02-17 12:30:34 MSK ОТМЕТКА:  ошибка повторного согласования SSL
3628-2014-02-17 12:30:41 MSK ОШИБКА:  обнаружена взаимоблокировка
3721:2014-02-17 12:30:41 MSK ПОДРОБНОСТИ:  Процесс 5345 ожидает в режиме ShareLock блокировку "транзакция 191878859"; заблокирован процессом 19088.
3937:   Процесс 19088 ожидает в режиме ShareLock блокировку "транзакция 191878687"; заблокирован процессом 5345.
4105:   Процесс 5345: UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;
4184-                                                                           UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241089;
4285-   Процесс 19088: UPDATE sessions SET serverid=-1 WHERE sessionid=6241090;
4365-                                                                           UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241090;
4466-2014-02-17 12:30:41 MSK ПОДСКАЗКА:  Подробности запроса смотрите в протоколе сервера.
4604-2014-02-17 12:30:41 MSK ОПЕРАТОР:  UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;



на sessions никакие триггеры не навешены. А вообще триггеры и NOTIFY есть в бд
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565913
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orfelin,

у вас в логе не PID не txid нет... с таким логом вы ничего не решите...

PS: может ли у вас внутри 1 транзакции вызываться больше одной UPDATE sessions?
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565934
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вобще постгрес при обнаружении deadlock пытается завершить одну из транзакций вовлеченных в deadlock, таким образом оставшаяся транзакция может выполнить свою работу. Регулируется это GUC'ом deadlock_timeout. Если автоматическое завершение не работает, то нужно руками завершить одного из участников с помощью pg_terminate_backend.
Бороться с ними нужно на уровне приложения (тем более что понимание у вас есть), нельзя допускать таких ситуаций когда использование ресурсов перекрывается транзакциями.
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565940
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukorfelin,
у вас в логе не PID не txid нет... с таким логом вы ничего не решите...


pid'ы есть
orfelinзаблокирован процессом 19088.
заблокирован процессом 5345.
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38565987
orfelin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
daevy,

у меня нет понимания какие два SQL запроса взаимо заблокировали друг друга

вложенных запросов обновляющих таблицу sessions нет
вот все варианты которые может вызывать мой сервер:

Код: sql
1.
UPDATE sessions SET isclosed=TRUE, logouttime='now()', closeby=13 WHERE userid=%d AND sessionid=%I64d


Код: sql
1.
2.
UPDATE sessions SET serverid=%d WHERE sessionid=%I64d;
UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=%d AND sessionid != %I64d;


Код: sql
1.
UPDATE sessions SET isclosed=true, logouttime='now()', closeby=15 WHERE isclosed=false;



других запросов нет. встроенных в PG функций работающих с sessions нет
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38566041
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эти запросы пытаются изменить одни и те же строки, с userid=89364, тут и возникает deadlock

-- 1
UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;
UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241089;

-- 2
UPDATE sessions SET serverid=-1 WHERE sessionid=6241090;
UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241090;
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38566105
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orfelinу меня нет понимания какие два SQL запроса взаимо заблокировали друг друга

эта информация есть в логе что вы привели, собственно вот:
4105: Процесс 5345: UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;
4184- UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241089;
4285- Процесс 19088: UPDATE sessions SET serverid=-1 WHERE sessionid=6241090;
4365- UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241090;

тут и пиды и запросы повлекшие deeadlock
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38566212
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orfelindaevy,

у меня нет понимания какие два SQL запроса взаимо заблокировали друг друга
Взаимно блокируются не запросы, а транзакции. У Вас в одной транзакции изменяется несколько sessions.
...
Рейтинг: 0 / 0
дедлок в постгресе. как лечить?
    #38566298
orfelin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
daevyorfelinу меня нет понимания какие два SQL запроса взаимо заблокировали друг друга

эта информация есть в логе что вы привели, собственно вот:
4105: Процесс 5345: UPDATE sessions SET serverid=-1 WHERE sessionid=6241089;
4184- UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241089;
4285- Процесс 19088: UPDATE sessions SET serverid=-1 WHERE sessionid=6241090;
4365- UPDATE sessions SET isclosed=true, closeby=14 WHERE userid=89364 AND sessionid != 6241090;

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


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