PostgreSQL и блокировка - PullRequest
       18

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

2 голосов
/ 12 апреля 2011

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

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

Ответы [ 2 ]

8 голосов
/ 12 апреля 2011

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

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

Ссылки:

Аналогичный вопрос

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

3 голосов
/ 12 апреля 2011

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

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

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

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

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


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...