mk_5884 Programming

自分で調べたIT関連のことなどを書いています

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 にはならない。

 

参考

oshiete.goo.ne.jp