なぜあなたが指定するのか、私は混乱してFOR UPDATE
います.なぜデータベースはあなたがSELECT
.
編集:申し訳ありませんが、質問が不十分でした。私はドキュメントが物事を「ロック読み取り」に変えると言っていることを知っていますFOR UPDATE
.ロックが伴う?
なぜあなたが指定するのか、私は混乱してFOR UPDATE
います.なぜデータベースはあなたがSELECT
.
編集:申し訳ありませんが、質問が不十分でした。私はドキュメントが物事を「ロック読み取り」に変えると言っていることを知っていますFOR UPDATE
.ロックが伴う?
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
トランザクションでテーブルをロックすることに関係しています。次のものがあるとします。
START TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT;
SELECT ステートメントの実行後、別のユーザーから別の SELECT がある場合、最初のトランザクションが COMMIT 行に到達するまで実行されません。
FOR UPDATE
また、トランザクションの外側は意味がないことに注意してください。
これが修正するように設計されている特定のケースは、列の値を読み取って更新する必要がある場合です。場合によっては、最初に列を更新し (列をロックします)、後で読み取ることで回避できる場合があります。たとえば、次のようになります。
UPDATE child_codes SET counter_field = counter_field + 1;
SELECT counter_field FROM child_codes;
これにより、counter_field の新しい値が返されますが、アプリケーションでは許容される場合があります。フィールドをリセットしようとしていた場合 (したがって元の値が必要だった場合)、または update ステートメントで表現できない複雑な計算がある場合は、受け入れられません。この場合、2 つの接続が競合して同じ列を同時に更新するのを避けるには、行をロックする必要があります。
RDBMS が FOR UPDATE をサポートしていない場合は、無駄な更新を実行することでシミュレートできます。
UPDATE child_codes SET counter_field = counter_field;
SELECT counter_field FROM child_codes;
UPDATE child_codes SET counter_field = 0;
SELECT FOR UPDATE は、これらの行をロックして、UPDATE してコミットするか、ロールバックしてロックを解除するまで、他の誰もアクセスできないようにすることを RDBMS に伝えます。
ロック読み取りを作成して、完了するまで誰も更新できないようにします。例
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
ここを参照してくださいhttp://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
行(またはテーブル全体)をロックして、別のセッションで行を同時に更新できないようにします。ロックは、トランザクションがコミットまたはロールバックされるまで保持されます。