PostgreSQL и блокировка

Надеюсь, некоторые более умные администраторы баз данных, чем я, могут помочь мне найти хорошее решение для того, что мне нужно сделать.

Для обсуждения давайте предположим, что у меня есть таблица под названием «работа» с некоторым количеством столбцов, одним из которых является столбец, который представляет право собственности на эту строку работы от данного клиента. Сценарий заключается в том, что у меня будет подключено 2 клиента и опрос таблицы для работы, когда появится строка (или некоторое количество строк), первый клиент, который выбирает строки, также обновит их, чтобы подразумевать право собственности, что обновление удалит эти строки из возвращаемых в любые другие варианты выбора клиента. Мой вопрос заключается в том, какой тип блокировки я могу использовать, чтобы предотвратить одновременное попадание двух клиентов в таблицу, и оба из них возвращают одни и те же строки с помощью выбора?

Операция UPDATE с предложением RETURNING – это способ сделать это.

UPDATE table SET ownership = owner RETURNING ( column list ); 

РЕКОМЕНДАЦИИ:

Похожие вопросы

Документация

Мой вопрос заключается в том, какой тип блокировки я могу использовать, чтобы предотвратить одновременное попадание двух клиентов в таблицу, и оба из них возвращают одни и те же строки с помощью выбора?

Здесь не требуется блокировка.

В UPDATE просто укажите, что вы хотите, чтобы скрипт взял на себя ответственность за эту задачу, если владелец по-прежнему является null (предполагая, что вы указываете не назначенные задачи). Это должно работать:

 UPDATE foo SET owner = ? WHERE id = ? AND owner = ? WHERE owner IS NULL 

Если количество измененных строк равно числу, которое вы ожидали (или предложение RETURNING возвращает результаты, предложенные @Ketema), то вы успешно захватили право собственности.


Поддельное редактирование, потому что я заметил ваш комментарий за несколько минут до отправки ответа:

например: 2 клиента, выдающие этот запрос одновременно, у них нет возможности манипулировать одними и теми же строками?

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