блокировкой, при запросе update к бд, если я в данной ситуации применю for update сильно ли разрешит это ситуацию или могут возникнуть другие проблемы?
Почему Вы думаете, что это вообще хоть как-то поможет? Кстати, возникла и возникла, проблема-то в чём? Производительность страдает, или ещё что-то?
А FOR UPDATE ты где применять собираешься?
В запросе на обновления таблице
Какого вида этот запрос? UPDATE ?
Обновляется ряд строк проста. Через update tabe_name as t set row_1 = v.row_1 from values ID, row_1 as v(ID, row_1) where t.ID = v.ID and p.row_2 = 1; ПРИМЕРНО ТАК
Ну, так куда ты FOR UPDATE хотел добавлять, в UPDATE ? Это бессмысленно и невозможно.
Хмм, просто нагуглил пока, что та, вам с этим не сталкивался еще, а не подскажешь как побороть deadlock?
дедлок — нормальное явление в многопользовательских системах, его невозможно искоренить.
А в каких случаях можно или используют select for update?
Для выборки данных, которые впоследствии будут изменены коммандой UPDATE
ИТОГО: for update тебе не нужно, Тебе нужно смотреть в логи сервера, где будет написано, кто с кем за-DEADLOCK-чился, и разбираться с этой ситуацией, как на уровне приложения, может быть, разрешить эту ситуацию
Зачем Вам "бороть" deadlock? Если они становятся проблемой (производительность, чаще всего) — есть методы избегания (avoidance), например сортировать updates, или блокировать общий ("ключевой") ресурс и т.п. Естественно, работает всё это не всегда.
Почему бы это не заюзать, хм
А в какой таблице локов можно посмотреть, кто с кем залочился?
Это не знаю, смотри в документации.
По большому счёту — ни в какой (т.е. эту ситуацию до её разрешения можно увидеть в pg_locks, только если сильно повезёт / специально стараться — она кратковременная), естественно. Можно смотреть в логах PostgreSQL, а кумулятивную статистику — в pg_stat_database.
Обсуждают сегодня