0

このテーブルには、Price と amount の 2 つのフィールドがあります。

この innodb テーブルに対して、価格が 100 未満のすべてのレコードを更新するために選択するクエリを実行しています (クエリ 1)。

  1. このクエリの実行中に、価格が 100 を超えるテーブルの行を挿入または更新できるようにしたいと考えています。これは確実に機能しますか?

  2. 同時に、(クエリ 1) が完了するまで、価格が 100 未満の行をテーブルに更新または挿入しようとする試みが行われないことを保証したいと思います。これも確かですか?

  3. タイプ 1 のクエリと質問 2 のクエリが発生しているときに、このテーブルで通常の select * from クエリを実行したい場合、これらの読み取りを実行できますか、またはロックがオフになるまでこれらの読み取りを待機する必要がありますか? これは確かでなければなりません。編集:これらの選択でテーブル内の任意のレコードにアクセスできるようにしたい

  4. 最後に、これを機能させるためにインデックスは重要ですか? それともそのまま動作しますか?

どうもありがとう。

4

1 に答える 1

1

テーブルに 2 つのフィールド (価格と金額) しかない場合、これは…まずいように思えます。確かにそこにはある種の他の識別子があるはずですか?

  1. はい。SELECT FOR UPDATE選択したレコードのみをロックします。

  2. 多分。トランザクション分離モードによっては、MySQL はインデックス範囲をロックして、クエリの一部としてスキャンされた範囲への挿入をブロックする場合があります。

  3. これは、使用するトランザクション分離モードによって異なります。より高い分離モードを使用している場合、更新のために行をロックすると、トランザクションがコミットされているかどうかに応じて、トランザクションが行を変更する場合と変更しない場合があるため、行が読み取られなくなります。詳細については、MySQL マニュアルの「SELECT ... FOR UPDATEおよびSELECT ... LOCK IN SHARE MODELocking Reads」のセクションを参照してください。

  4. はい。パート 2 で説明したインデックス範囲のロックは、インデックスの存在に依存します。とにかく、インデックスなしのクエリを実行するのは悪い考えです — 避けてください。

于 2013-05-13T15:25:58.873 に答える