10

なぜあなたが指定するのか、私は混乱してFOR UPDATEいます.なぜデータベースはあなたがSELECT.

編集:申し訳ありませんが、質問が不十分でした。私はドキュメントが物事を「ロック読み取り」に変えると言っていることを知っていますFOR UPDATE.ロックが伴う?

4

5 に答える 5

17

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また、トランザクションの外側は意味がないことに注意してください。

于 2011-03-23T20:42:25.610 に答える
3

これが修正するように設計されている特定のケースは、列の値を読み取って更新する必要がある場合です。場合によっては、最初に列を更新し (列をロックします)、後で読み取ることで回避できる場合があります。たとえば、次のようになります。

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;
于 2011-03-23T20:58:24.677 に答える
1

SELECT FOR UPDATE は、これらの行をロックして、UPDATE してコミットするか、ロールバックしてロックを解除するまで、他の誰もアクセスできないようにすることを RDBMS に伝えます。

http://www.techonthenet.com/oracle/cursors/for_update.php

于 2011-03-23T20:41:39.650 に答える
0

ロック読み取りを作成して、完了するまで誰も更新できないようにします。例

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

于 2011-03-23T20:42:02.820 に答える
0

行(またはテーブル全体)をロックして、別のセッションで行を同時に更新できないようにします。ロックは、トランザクションがコミットまたはロールバックされるまで保持されます。

于 2011-03-23T20:42:11.600 に答える