Эквивалент NoLock Hint в PostgreSQL

В SQLServer вы можете использовать синтаксис "(nolock)", чтобы гарантировать, что запрос не блокирует таблицу или не блокируется другими запросами, блокирующими ту же таблицу. например

SELECT * FROM mytable (nolock) WHERE id = blah

Какой эквивалентный синтаксис в Postgres? Я нашел некоторую документацию по блокировке таблиц в PG (http://www.postgresql.org/docs/8.1/interactive/sql-lock.html), но все они, похоже, направлены на то, как заблокировать таблицу, а не гарантировать, что она не заблокирована.


person Cerin    schedule 06.03.2010    source источник
comment
Подождите, дайте мне посмотреть, понимаю ли я это. Есть возможность ИГНОРИРОВАТЬ блокировки на столе??? Если это правда, это плохая идея, которая стоит там с возможностью игнорировать существующие строки при проверке новых ограничений.   -  person Matthew Wood    schedule 07.03.2010
comment
@Matthew Wood: В целом, я склонен согласиться. Однако игнорирование блокировок полезно в определенных случаях, например при отладке, когда вы хотите проверить содержимое таблицы, даже если она находится в середине очень большого обновления. Игнорирование блокировки предпочтительнее, чем ожидание завершения обновления в течение нескольких минут/часов.   -  person Cerin    schedule 07.03.2010


Ответы (3)


SELECT не блокирует никакую таблицу в PostgreSQL, если вам не нужна блокировка:

SELECT * FROM tablename FOR UPDATE;

PostgreSQL использует MVCC, чтобы свести к минимуму конфликты за производительность в многопользовательских средах. Читатели не конфликтуют ни с писателями, ни с другими читателями.

person Frank Heikens    schedule 07.03.2010
comment
Это неправильно, это эквивалент явной блокировки с подсказкой WITH(UPDLOCK), но вопрос был в том, как получить No Lock! Ответ @ matthew-wood более актуален. - person Bogdan Mart; 27.04.2019
comment
@BogdanMart Это был его пример выбора с блокировкой, потому что он неявно не блокируется. - person swade; 13.06.2019

Я провел некоторое исследование, и оказалось, что подсказка NOLOCK в SQL Server примерно такая же, как уровень изоляции транзакции READ UNCOMMITTED. В PostgreSQL вы можете установить READ UNCOMMITTED, но он автоматически обновит уровень до READ COMMITTED. READ UNCOMMITTED не поддерживается.

Документация PostgreSQL 8.4 для изоляции транзакций: http://www.postgresql.org/docs/8.4/static/transaction-iso.html

person Matthew Wood    schedule 07.03.2010
comment
Небольшая цитата, чтобы подчеркнуть причину этого: Причина, по которой PostgreSQL предоставляет только два уровня изоляции, заключается в том, что это единственный разумный способ сопоставить стандартные уровни изоляции с многоверсионной архитектурой управления параллелизмом. - person dezso; 06.02.2013
comment
@dezso: +1, но в 9.1 был добавлен SERIALIZABLE, поэтому документы были обновлены, чтобы сказать ... обеспечивает три уровня изоляции ... но в остальном то же самое. - person Matthew Wood; 11.03.2013

Цель nolock или readpast — проверить, заблокирована ли запись в данный момент. Пользователь может использовать это в обновлении, чтобы увидеть, была ли идентифицированная запись изменена (затронута строка); если запись не была заблокирована, то затронутая строка будет равна 1; если o, то запись заблокирована

Основываясь на этом результате, пользователь может использовать выбор для обновления, чтобы заблокировать его для собственного использования.

person user13950163    schedule 17.07.2020
comment
Вопрос заключался в том, чтобы узнать, что является эквивалентом для Postgres, а не в чем цель nolock. - person Alexis; 17.07.2020