0

以下のような person というテーブルがあるとします。

CREATE TABLE person (
    id INT,
    name VARCHAR(30),
    point INT
);

他人の好みに合わせて人のポイントを変えて表全体を更新したい

UPDATE person SET point=(
    SELECT point FROM person WHERE some-condition
);

または、単純に 1 ずつ増やすだけです。

UPDATE person SET point=point+1;

上記のスクリプトを実行すると、どの行がロックされ、更新ステートメントが終了するか、2 つの更新操作の間に実行できるようになるまで他のステートメントが待機しますか?

4

1 に答える 1

1

どちらの update ステートメントにも where 句がありません。(最初のものには where 句を含む select があります。その where 句を更新の一部にすることは可能ですが、それについてはわかりません。)

つまり、personテーブル内のすべての行が更新されます。InnoDB が提供するトランザクション セマンティクスでは、更新全体が完了するまで各行がロックされるとされています。つまり、他の更新はブロックされます。このクエリとは異なる順序で他の更新を試みると、デッドロックが発生する危険があります。

他のクライアント接続の選択クエリでは、テーブルの以前の状態が表示されます...更新ステートメントが開始される直前の状態...更新ステートメントが完了するまで。多くの場合、 InnoDB は他の接続のクエリへの応答を遅らせることなくそれを行うことができます。ただし、応答を遅らせなければならない場合もあります。InnoDB が結果をコミットしている間、更新クエリの最後に最大の遅延が発生する可能性があります。

これを念頭に置いてください。トランザクション セマンティクスを実装するために、InnoDB はクエリ パフォーマンスの予測可能性を犠牲にします。

そうすることが理にかなっている場合は、where句なしで更新を行うことは避けることを強くお勧めします。2番目の(すべての人に別のポイントを与える)クエリにはありません。

于 2013-07-08T12:39:42.560 に答える