この記事は最終更新日から1年以上が経過しています。

READロックとWRITEロックがよくわからなくなるので改めて

MySQLではLOCK TABLES文で明示的にテーブルにロックをかけることが出来ます。
で、いつもわからなくなるんですね。READロックとWRITEロックが。

  1. 他のスレッドからWRITE不可
  2. 他のスレッドからREAD/WRITE不可

さて、どっちがREADロックでどっちがWRITEロックか分かりますか?

単純に考えると

  1. 他のスレッドからWRITE不可 → 【WRITEロック】
  2. 他のスレッドからREAD/WRITE不可 → 【READロック】

って思うでしょう。普通。いや実はこれ不正解なんです。

「えっ?なんで?」って思いませんか。WRITEを出来なくする(ロックする)から「WRITEロック」、READも出来なくする(ロックする)から「READロック」じゃないのって。

僕だけですかね。

いつも間違えて、あれ?どっちだったけ?ってなって、毎度調べてしまっているので、今回は改めて頭に叩き込むことを決意したのです。

READロックとWRITEロックのそれぞれの機能

スレッド READロック WRITEロック
自スレッド READ可能
WRITE不可
READ可能
WRITE可能
他スレッド READ可能
WRITE不可
READ不可
WRITE不可

うん、叩き込むって程のボリュームではないですね。しかしなぜ間違うのか。

READロックは自スレッドも他スレッドも同じロックがかかりますが、WRITEロックは自スレッドにはロックがかからない。。。

そうか!今まで他スレッド目線で考えていたから間違えていたんだ!

自スレッド目線で考えてみる

  1. READするからちょっと待って → 【READロック】
  2. WRITEするからちょっと待って → 【WRITEロック】

「READするからちょっと待って」って状況は別に書き込み出来なくてもいいですし、他のスレッドからの書き込みも勘弁です。これがREADロック
「WRITEするからちょっと待って」は自スレッドはもちろん読み込みも書き込みもするんだけど、他のスレッドからは見ないでほしいし書き込みもちょっと勘弁、って状況。これがWRITEロック。

いやー、覚えやすいですね。僕と同じ悩みを持っていた人は是非この様に覚えてみてください。まさに晴天の霹靂。これで今後間違えることは無いでしょう。

共有ロックと排他ロック

ちなみに

  • READロック → 共有ロック
  • WRITEロック → 排他ロック

とも言いいます。

READロックは他のスレッドからもREADロック可能なので共有ロック(WRITEロックは出来ません)。WRITEロックは他のスレッドからREAD/WRITEロック共に出来ないので排他ロック。

うん、これは間違えようがない。

コメントを残す