Intereting Posts
Как выполнить запросы IN () SQL с помощью JDBCTemplate от Spring? ActiveRecord Find – пропустить записи или получить каждую N-ю запись Есть ли альтернатива MySQL в MySQL? Как использовать предложение IN в iBATIS? Учитывая долготу и широту двух областей, как найти расстояние между ними в метрах. Как запросить в SQL ..? Ошибка использования базы данных с Entity Framework 4 Code First Как получить строки из таблицы, если итоговые строки в Oracle более 10? LINQ вставляет запрос ESCAPE N '~' Сравнение с датой в Oracle sql Order BY превращает запрос 30 мс в запрос 7120 мс. Известная проблема с производительностью? Как я могу выбрать столбцы первичного ключа из таблицы? Присоединить таблицу с комбинированным ключом дважды От многих до многих отношений, использующих SQL и Linq (сущность framework / для сущностей) SQL: получение записей, созданных во временном диапазоне для определенных дат SQL Отсутствует правая скобка по порядку по выражению

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 . Выполнение этих заявлений за пределами транзакции будет правильным. Поведение внутри транзакции будет отличаться.