MySQLトランザクションでSELECTもトランザクション対象にする話

同時に多人数で更新したり、金融系などでどうしても更新中は他の人に更新して欲しくない時がありますね。
そんな時に必要なのが、InnoDBであることと、SELECTの文末にFOR UPDATEを付ける事です。

参考:MySQLのInnoDBにおける行ロック:トランザクション――共有モードと排他モード、デッドロックの問題

1. A君
>START TRANSACTION; トランザクション開始
>SELECT * from TBL FOR UPDATE; ボクはこのデータを見てトランザクション処理するよ!
>データ取得!!

    • -

2. B君
>START TRANSACTION; トランザクション開始
>SELECT * from TBL FOR UPDATE; ボクはこのデータを見てトランザクション処理するよ!
>データを....待つ!!

    • -

3. A君
>COMMIT; 処理が終わったよ!!
or
>exit

    • -

4. B君
>あ、遂にデータ取得!!



こんな感じです。で、「FOR UPDATE」これをつけなければ、B君はすぐに取得できます。更新するから絶対最新の情報を下さいね!という合図ですね。