PostgreSQL Эквивалент NoSock подсказки SQLServer
В SQLServer вы можете использовать синтаксис "(nolock)", чтобы гарантировать, что запрос не блокирует таблицу или не блокируется другими запросами, блокирующими ту же таблицу. например
SELECT * FROM mytable (nolock) WHERE id = blah
Какой эквивалентный синтаксис в Postgres? Я нашел некоторую документацию по блокировке таблиц в PG ( http://www.postgresql.org/docs/8.1/interactive/sql-lock.html), но все это похоже на то, как заблокировать таблицу, а не гарантировать, что она не заблокирована,
5 ответов
SELECT не блокирует никакие таблицы в PostgreSQL, если вы не хотите блокировать:
SELECT * FROM tablename FOR UPDATE;
PostgreSQL использует MVCC для минимизации конфликтов блокировок, чтобы обеспечить разумную производительность в многопользовательских средах. Читатели не конфликтуют ни с писателями, ни с другими читателями.
Я провел некоторое исследование, и похоже, что подсказка 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
Это старый вопрос, но я думаю, что на настоящий вопрос не было ответа.
Запрос SELECT (который не содержит
for update
предложение) никогда не будет блокировать какие-либо строки (или таблицу) и не будет блокировать одновременный доступ к таблице. Параллельный DML (INSERT, UPDATE, DELETE) также не будет блокировать оператор SELECT.
Проще говоря: не нужно
(nolock)
в Постгресе. Читатели никогда не блокируют писателей, а писатели никогда не блокируют читателей
Цель nolock или readpast - проверить, заблокирована ли запись в данный момент. Пользователь может использовать это в обновлении, чтобы увидеть, была ли изменена идентифицированная запись (с изменением строк); если запись не была заблокирована, то будет заблокировано 1; если o, то запись заблокирована
На основании этого результата пользователь может использовать выбор для обновления, чтобы заблокировать его для собственного использования.
Каждый оператор SQL является неявной транзакцией.
NOLOCK
подсказка соответствует
READ UNCOMMITTED
(
DIRTY READ
) уровень изоляции транзакций .
BEGIN TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(1) FROM my_table;
END;
На самом деле, этот код делает то же самое, что
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED
но гарантирует ожидаемое поведение в дальнейшем.
Также избегайте использования COUNT(*), за исключением случаев, когда это действительно необходимо.