次のような一連のSQLステートメントがあります。
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
値を再計算している間、カウンターが読み取られないようにしたいのですが、Postgresのドキュメントによると、「行レベルのロックはデータのクエリに影響を与えません。それらは同じ行への書き込みのみをブロックします。」
質問:
- 読み取りを妨げない場合の「排他的」行ロックの意味は何ですか?他のトランザクションが共有ロックを取得するのを防ぐだけですか?
- SELECT ... FOR SHAREを使用して行を読み取ると、「排他的」ロックと同じ影響がありますか?
- テーブル/スキーマ/データベースのMVCCをオフにして、インプレース書き込みを許可することは可能ですか?