Мы планируем использовать простой плоский стол без ссылок в качестве хранилища транзакций в Postgres. Таблица постоянно обновляется из разных потоков. Нам нужно выбрать максимум 4 минимальной 1 строки из таблицы, заблокировать ее, выполнить обновление в поле состояния и освободить блокировку. В идеале это должно быть так, что параллельные запросы не блокируют друг друга, каждый запрос может изменить свой собственный набор строк.Как обновить случайные 4 строки в таблице, используя блокировку уровня строк с помощью Postgres?
После прочтения документации я думаю, что я мог бы сделать это с:
SELECT user_id FROM rooms LIMIT 1 INTO local_user_id
WHERE user_status=0 FOR UPDATE;
UPDATE rooms SET user_status = 1
WHERE user_id = local_user_id;
Однако, мне нужно обновить 1-4 пользователей в то время, связывая весь максимум 4 пользователей в в одной транзакции сбросит количество транзакций до 1/4-го наилучшего случая (при условии, что большая часть результата выбора у 4 пользователей). Каков идиоматический способ решения этой проблемы с помощью Postgres 9.6?
Update1:
То, что я пытаюсь достичь здесь выстраивается очередь, как поведение, каждый поток получает несколько элементов и обрабатывает те, в то время как другие потоки могут счастливо читать из остальных строк и процесса 4 других строк параллельно и параллельно.
В чем проблема с написанием 'LIMIT 4'? Это даст вам 4 или менее строк результатов. –
И как я могу перебирать 4 идентификатора? – Istvan
На вашем любимом языке программирования (или язык хранимых процедур, например [PL/pgSQL] (https://www.postgresql.org/docs/current/static/plpgsql.html) или [PL/Perl] (https: // www .postgresql.org/docs/current/static/plperl.html), если вы хотите написать функцию базы данных). –