так:
perform 1 from table1 t1 join table2 t2 on t2.foreign_id = t1.id order by t1.id for update
Но на сколько я понимаю, такая блокировка не очень хорошая(джоин 2 таблицы)? Как можно сделать лучше ?
@Yaroslav_Schekin , не подскажешь случаем ? :)
Выбросить это всё целиком (т.е. мой ответ — "нет, на самом деле не нужно Вам ничего блокировать" [это почти наверняка так]), и пересмотреть решение (или рассказать здесь, в чём на самом деле состоит задача, а не спрашивать, как заставить работать какие-то "костыли"). ;)
не, там как раз такое решение и вышло Там пакетные обновления и они из разных подсистем ( разные кроны/сервисы) Всё решалось вот так: for X in select from table1 order by id loop -- тут обработка обновления end loop И всё было крисиво, дедлоки убрались. Но тут потребовалось этот цикл сортировать в другом порядке Принял решение - перед циклом сделать блокировку. Но вот такое решение ( from join for update ) - не очень хорошее
> там как раз такое решение и вышло Вы опять описываете решение неизвестной проблемы. :( > И всё было крисиво, дедлоки убрались. А зачем вообще было убирать deadlocks? > Но тут потребовалось этот цикл сортировать в другом порядке И при сортировке в другом порядке (главное, в одном во всех запросах) свойство "дедлоки убрались" почти всегда сохраняется. Т.е. зачем блокировать-то что-то? > Принял решение - перед циклом сделать блокировку. Лучше бы Вы приняли решение описать задачу. ;( Ладно, если уж хотите из пушки по воробьям — вот Вам https://www.postgresql.org/docs/current/sql-lock.html ...
статья - лок таблицы, я же за лок на уровне строк Если описывать всю проблему и как что устроено - не хватит и 1к символов :) Ладно, буду искать оптимальное решение
Вы просили лок таблицы — вам показали лок таблицы.
> Нужно заблокировать 2 таблицы для обновления: А кто написал вот это, а (из вопроса не понятно, что речь про rows)? ;) Без описания того, зачем Вам это нужно, ответы и будут примерно такие. > Ладно, буду искать оптимальное решение Тем не менее, FOR [NO KEY] UPDATE блокирует все выбранные rows всех таблиц в запросе... что с ним не так-то? Для конкретного указания, в каких таблицах блокировать, есть FOR lock_strength [ OF table_name [, ...] ], кстати.
Обсуждают сегодня