Mysql SELECT FOR UPDATE について
同時に更新されるのを防ぐためにSELECT FOR UPDATE を使用する。
例)
hoge.status = 0 を、status = 3 に更新するバッチがあるとする
BEGIN;
SELECT * FROM hoge WHERE status = 0 FOR UPDATE;
UPDATE hoge set status = 3 WHERE status = 0
COMMIT;
上記実行中にユーザが個別で「status = 0だったらstatus = 9 に更新する処理」を画面上から行った場合、
SELECT FOR UPDATE をしていないとバッチよりこの処理が先に終わってしまいstatus = 9になってしまう。
しかし
SELECT FOR UPDATE をしているのでバッチの処理が終わるまではユーザは待ち状態になる。
で、バッチが終わってからユーザの処理が走るので、既にstatus = 3だから
「既に処理済です」みたいなページを表示されてstatus = 0 にはならない。
参考