いいえ。 更新用
これらの行のみをロック 、それらをロックしようとする別のトランザクション( FOR SHARE
を使用) 、 FOR UPDATE
、 UPDATE
またはDELETE
)トランザクションがコミットまたはロールバックされるまでブロックします。
挿入/更新/削除をブロックするテーブル全体のロックが必要な場合は、おそらく LOCK TABLE ... IN EXCLUSIVE MODE
が必要です。 。
-
lock_timeout<を参照してください。 / code> 設定
。これは9.3で追加され、古いバージョンでは使用できません。古いバージョンの大まかな概算は、
statement_timeout
で実現できます。 、ただし、ステートメントが不必要にキャンセルされる可能性があります。statement_timeout
の場合 が1秒で、ステートメントがロックで950ミリ秒待機すると、ロックを取得して続行する場合がありますが、タイムアウトによってすぐにキャンセルされます。欲しいものではありません。lock_timeout
を設定するクエリレベルの方法はありません 、しかしあなたはできます そして、ただ:SET LOCAL lock_timeout ='1s';
BEGIN
を実行した後 トランザクション。 -
ステートメントがあります タイムアウトしますが、ロックはトランザクションで保持されます レベル。トランザクションタイムアウト機能はありません。
シングルステートメントトランザクションを実行している場合は、
statement_timeout
を設定するだけです。 ステートメントを実行する前に、実行できる時間を制限します。これは、ロックを保持できる期間を制限することとはまったく同じではありません。ただし、許可された1秒のうち900ミリ秒待機し、実際には100ミリ秒だけロックを保持してから、タイムアウトによってキャンセルされる可能性があるためです。 -
いいえ。次のことを行う必要があります:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
SET LOCAL
これには適切であり、好ましいです。クエリのテキストでそれを行う方法はありません。別のステートメントである必要があります。
リンクしたメーリングリストの投稿は、(少なくともパブリックPostgreSQLリリースでは)実装されておらず、存在しない架空の構文の提案です。
このような状況では、「楽観的ロック」と呼ばれることが多い「楽観的同時実行制御」を検討することをお勧めします。クエリの繰り返し率が高くなり、アプリケーションロジックがさらに必要になる代わりに、ロック動作をより細かく制御できます。