web-dev-qa-db-ja.com

SQLServerのNoLockヒントに相当するPostgreSQL

SQLServerでは、構文 "(nolock)"を使用して、クエリがテーブルをロックしないか、同じテーブルをロックしている他のクエリによってブロックされないようにすることができます。例えば.

SELECT * FROM mytable (nolock) WHERE id = blah

Postgresの同等の構文は何ですか?私はPGのテーブルロックに関するドキュメントをいくつか見つけました( http://www.postgresql.org/docs/8.1/interactive/sql-lock.html )が、それはすべてlockテーブル、それがロックされていないことを確認しません。

42
Cerin

ロックが必要でない限り、SELECTはPostgreSQLのどのテーブルもロックしません。

SELECT * FROM tablename FOR UPDATE;

PostgreSQLは [〜#〜] mvcc [〜#〜] を使用して、ロックの競合を最小限に抑え、マルチユーザー環境で適切なパフォーマンスを実現します。リーダーはライターや他のリーダーと競合しません。

59
Frank Heikens

いくつかの調査を行ったところ、SQL ServerのNOLOCKヒントはREAD UNCOMMITTEDトランザクション分離レベルとほぼ同じであるようです。 PostgreSQLではREAD UNCOMMITTEDを設定できますが、レベルがREAD COMMITTEDに自動的にアップグレードされます。 READ UNCOMMITTEDはサポートされていません。

トランザクションの分離に関するPostgreSQL 8.4のドキュメント: http://www.postgresql.org/docs/8.4/static/transaction-iso.html

13
Matthew Wood