2010-03-06 4 views
29

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

SELECT * FROM mytable (nolock) WHERE id = blah 

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

+1

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

+3

@Matthew Wood: В общем, я хотел бы согласиться. Однако игнорирование блокировок полезно для некоторых случаев, таких как отладка, когда вы хотите проверить содержимое таблицы, даже если она находится в середине очень большого обновления. Игнорирование блокировки предпочтительнее ожидания нескольких минут/часов для завершения обновления. – Cerin

ответ

38

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

SELECT * FROM tablename FOR UPDATE; 

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

4

Я провел некоторое исследование, и кажется, что подсказка 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

+4

Небольшая цитата, чтобы подчеркнуть причину этого: _ Причина, по которой PostgreSQL предоставляет только два уровня изоляции, заключается в том, что это единственный разумный способ сопоставления стандартных уровней изоляции с архитектурой параллелизма параллелизма. – dezso

+3

@dezso: +1, но в 9.1 SERIALIZABLE был добавлен, поэтому документы были обновлены, чтобы сказать: «... содержит три уровня изоляции ...», но в остальном то же самое. –

Смежные вопросы