2011-07-06 8 views
1

可能性の複製]を選択:
SELECT … FOR UPDATE and MAX()UPDATE FOR

このクエリのロックの行を?

select max(id) from table where id like '9%' for update 

他のユーザーがこのクエリを実行するとどうなりますか?

thisです。

+0

これは私の質問です。私の質問の最後の行を読んでください – user677900

+0

はい、私は知っています。私はあなたの質問の最後の行からそれを見つけました。そして私はまだ同じことを尋ねる複数の質問をするべきではないと思います。 –

答えて

3

インデックスにインデックスがない場合は、すべてのレコードがロックされます。しかし、あなたはそのようなインデックスを持っていると思います。これにより、一致するすべてのレコード(その間にいくつかのレコードを含む)がロックされます(3と5をロックすると4もロックされています)。

SELECT ... FOR UPDATEは、読み取る各行の排他ロック。したがって、検索されたSQL UPDATEが行に対して設定するのと同じロックを設定します。あなたは、この情報がインデックスからoptainedすることができますので、テーブルからすべての行を読む必要はありません... FROM SELECT MAX(ID)の場合

編集 。正確に1つの行をロックしたい場合は、SELECT * FROM table WHERE id = SELECT max(id)FROM table

+0

更新のための別のselect max(id)は何を返すのですか? – user677900

+1

select max(id)は行ではなくインデックスのみを読み込む必要があるので、何もロックしない可能性があります。select *を実行する必要があります。id = select max(id) –

+0

これは、何もロックしない?更新のためにmax()を選択しないでください。 – user677900