重複の可能性:
SELECT … FOR UPDATE および MAX()
このクエリのどの行がロックされますか?
select max(id) from table where id like '9%' for update
別のユーザーがこのクエリを実行するとどうなりますか?
これは関連する質問です。
重複の可能性:
SELECT … FOR UPDATE および MAX()
このクエリのどの行がロックされますか?
select max(id) from table where id like '9%' for update
別のユーザーがこのクエリを実行するとどうなりますか?
これは関連する質問です。
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 になります。
私は、トランザクションの分離レベルに依存していると推測します。