sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLロック待機の期間の制御

    いいえ。 更新用 これらの行のみをロック 、それらをロックしようとする別のトランザクション( FOR SHARE を使用) 、 FOR UPDATE UPDATE またはDELETE )トランザクションがコミットまたはロールバックされるまでブロックします。

    挿入/更新/削除をブロックするテーブル全体のロックが必要な場合は、おそらく LOCK TABLE ... IN EXCLUSIVE MODEが必要です。 。

    1. lock_timeout<を参照してください。 / code> 設定 。これは9.3で追加され、古いバージョンでは使用できません。

      古いバージョンの大まかな概算は、 statement_timeoutで実現できます。 、ただし、ステートメントが不必要にキャンセルされる可能性があります。 statement_timeoutの場合 が1秒で、ステートメントがロックで950ミリ秒待機すると、ロックを取得して続行する場合がありますが、タイムアウトによってすぐにキャンセルされます。欲しいものではありません。

      lock_timeoutを設定するクエリレベルの方法はありません 、しかしあなたはできます そして、ただ:

      SET LOCAL lock_timeout ='1s';

      BEGINを実行した後 トランザクション。

    2. ステートメントがあります タイムアウトしますが、ロックはトランザクションで保持されます レベル。トランザクションタイムアウト機能はありません。

      シングルステートメントトランザクションを実行している場合は、 statement_timeoutを設定するだけです。 ステートメントを実行する前に、実行できる時間を制限します。これは、ロックを保持できる期間を制限することとはまったく同じではありません。ただし、許可された1秒のうち900ミリ秒待機し、実際には100ミリ秒だけロックを保持してから、タイムアウトによってキャンセルされる可能性があるためです。

    3. いいえ。次のことを行う必要があります:

      BEGIN;
      SET LOCAL lock_timeout = '4s';
      SELECT ....;
      COMMIT;
      
    4. SET LOCAL これには適切であり、好ましいです。

      クエリのテキストでそれを行う方法はありません。別のステートメントである必要があります。

      リンクしたメーリングリストの投稿は、(少なくともパブリックPostgreSQLリリースでは)実装されておらず、存在しない架空の構文の提案です。

    このような状況では、「楽観的ロック」と呼ばれることが多い「楽観的同時実行制御」を検討することをお勧めします。クエリの繰り返し率が高くなり、アプリケーションロジックがさらに必要になる代わりに、ロック動作をより細かく制御できます。




    1. PHPを使用してMySQLの「ft_min_word_len」構成変数の値を取得するにはどうすればよいですか?

    2. byteaとして取得されたPostgreSQLJDBCNull文字列

    3. OracleのSQLを使用して、テーブルが同一であるかどうかを確認します

    4. MySQLDataReaderがC#でNull値の問題を取得しています