1

重複の可能性:
SELECT … FOR UPDATE および MAX()

このクエリのどの行がロックされますか?

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

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

これは関連する質問です。

4

2 に答える 2

4

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

SELECT ... FOR UPDATE は、最新の利用可能なデータを読み取り、読み取る各行に排他ロックを設定します。したがって、検索された SQL UPDATE が行に設定するのと同じロックを設定します。

edit SELECT max(id) FROM ... の場合、この情報はインデックスから取得できるため、テーブルから行を読み取る必要はありません。正確に 1 つの行をロックする場合、正しいクエリは SELECT * FROM table WHERE id = SELECT max(id) FROM table になります。

于 2011-07-06T09:40:09.380 に答える
2

私は、トランザクションの分離レベルに依存していると推測します。

于 2011-07-06T09:00:15.640 に答える