悲観ロック
ロックのやり方の分類だよ
「ダブルブッキングする可能性が高い(低くない)」や「ダブルブッキングしたらヤバい」という想定になっているやつだよ
具体的なやり方は、いろいろあるっぽいよ
「楽観ロック」の逆だよ
簡単に書くよ
悲観ロック(読:ヒカンロック 英:pessimistic locking)とは
「これは今、俺が使ってるからさ。他の人は触らないでね」にすること(ロック)の分類のひとつ
であり
「ダブルブッキングはダメ。ゼッタイ。」になっているロックのこと
です。
もう少し具体的に書くと
「ダブルブッキングする可能性が低くないし、ダブルブッキングしたらヤバいよな。絶対にダブルブッキングしないようにしておくか」と悲観的に考えて設計されているロックのこと
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「排他制御」と「ロック」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
排他制御は「ダブルブッキングしないようにすること」です。
同時に使われるとマズい(おかしくなる)ものに組み込む仕組みで、1つの物を同時に使わせないための工夫です。
今回 登場するロックは「これは今、俺が使っているからさ。他の人は触らないでね」です。
鍵をかければ、他の人は使えないですよね?
そのような状態、もしくは、そのような状態にする行為です。
ロックは排他制御を実現する手段のひとつです。
以上を踏まえて、本題に入ります。
ある日のことです。
ピヨ太君とピヨ子さんでピヨピヨシステムを作ることにしました。
ピヨピヨシステムではダブルブッキングする可能性がある処理をやります。
ロックの仕組みを入れておきましょう。
ピヨ太君とピヨ子さんは「どんな仕組みでロックする?」を話し合いました。
ピヨ太君は「ダブルブッキングする可能性は低いし、もしダブルブッキングしてもそこまでヤバいことにはならないよね。必要最低限のロックにしようよ」と言いました。
「ダブルブッキングしたらドンマイ!」案です。
ピヨ子さんは「ダブルブッキングしたらマズいでしょ。ダブルブッキングしないように、しっかりとロックするわよ」と言いました。
「ダブルブッキングはダメ。ゼッタイ。」案です。
この話におけるピヨ子さんの考え方
「ダブルブッキングしたらマズいでしょ。ダブルブッキングしないように、しっかりとロックするわよ」に沿って作られたロック
が「悲観ロック」です。
あと、ついでなので書いておくと、ピヨ太君の考え方
「ダブルブッキングする可能性は低いし、もしダブルブッキングしてもそこまでヤバいことにはならないよね。必要最低限のロックにしようよ」に沿って作られたロック
は「楽観ロック」と言います。
悲観ロックや楽観ロックは「こんな考えで設計してあるよ」を表す用語です。
具体的なやり方は(多分)いろいろ あります。
例えば、そうですね。
ピヨ子さんがデータベースに入っているデータを更新しようとしています。
データベースに入っているデータを更新するときの一般的な流れは
1.該当するデータを取り出す
2.取り出したデータを加工する
3.加工した内容で更新する
です。
今回は
1.データベースに入っている値(数字)を取り出す
2.取り出した値に1を足す
3.「取り出した値に1を足した値」でデータベースの元の値を更新する
処理をやることにします。
ピヨ子さんはデータベースに入っている値を取り出します。
値は「1」でした。
ピヨ子さんは、この時点でデータベースをロックします。
データベースに「ピヨ子が使用中。他の人は触らないでね」と張り紙をしました。
次に、取り出した値に1を足します。
値は「2」になりました。
ピヨ子さんは「2」でデータベースを更新します。
ロックしているので他の人は触っていません。
おかしなことにはならないはずです。
これで更新は終わりです。
ピヨ子さんは「ピヨ子が使用中。他の人は触らないでね」の張り紙を外しました。
ピヨ子さんは「ダブルブッキングしたらマズいわね」と考え、自分が使い始める時点でロックしました。
使い終わった時点でロックを解除しました。
このようなやり方が悲観ロックの一例です。
おっと、今のピヨ子さんと同じ処理をピヨ太君もやろうとしているようです。
せっかくなので、見てみましょう。
ピヨ太君はデータベースに入っている値を取り出しました。
値は「1」でした。
ピヨ太君は、この時点ではロックしません。
そのまま取り出した値に1を足します。
値は「2」になりました。
ピヨ太君は「2」で更新し……ようと思いましたが、もし他の人に更新されていたらマズいので、もう一度同じデータを取り出してみました。
今度は「5」が出てきました。
どうやら、ピヨ太君があれこれしている間に誰かが「1」から「5」に更新してしまったようです。
この状況で、ピヨ太君が値を「2」に更新したら、おかしなことになりそうですね。
ピヨ太君は更新しようと思っていた「2」を捨てました。
ピヨ太君は「多分ダブルブッキングしないでしょ」と考え、データを取り出した時点ではデータベースをロックしませんでした。
データを更新する直前に「データが変わっていないかな?」を確認しました。
実際にロックしたわけでは ありませんが、これがロックに相当する処理です。
データが変わっていたので更新するのを止めました。
変わっていなかったら更新したはずです。
このようなやり方が楽観ロックの一例です。
せっかくなので併せて覚えてあげてください。
悲観ロック:「ダブルブッキングはダメ。ゼッタイ。」ロック
楽観ロック:「ダブルブッキングしたらドンマイ!」ロック
です。
以上で悲観ロック(と楽観ロック)の大雑把な説明は終わりですが、もう少しだけ、専門用語をガッツリ使った補足説明をしておきます。
気が向いたら読んでやってほしいのですが、ある程度の専門用語がないと分からない話です。
読んで分からなかった人は「まだ自分には早いな」と判断して、理解することを未来の自分に託してください。

それでは、いってみましょう。
私の理解では、悲観ロックや楽観ロックは
設計思想
です。
必ずしも具体的なやり方を指す用語ではないと解釈しています。
例えば、SQLにおいて、select文の最後に「FOR UPDATE」を付けると悲観ロックになります。
ただし
1.データを取得(select文を実行)
2.あれやこれやの処理
3.「1」の状態からデータが変わってないか確認するためにデータ取得(「FOR UPDATE」付きのselect文を実行)
4.データ更新(update文を実行)
のような処理をやったら、全体としては楽観ロックですよね?
そのため、機械的に「このSQL文に『FOR UPDATE』が付いているから、この処理は悲観ロックだな」とか考えていると、思わぬミスをする可能性があります。
ご注意ください。
一言でまとめるよ
まぁ「悲観ロック」って単語が出てきたら「『絶対にダブルブッキングしないようにするぜ!』な考えで作られているロック
(「これは今、俺が使ってるからさ。他の人は触らないでね」にすること)なんだな~」と お考えください。
おまけ
■訳してみるよ
「悲観」は日本語ですね。
「lock(ロック)」の意味は「錠前」とか「錠を掛ける」とか「閉じ込める」とか「固定する」とか「動けなくする」とかです。
何となく くっつけると
悲観した錠をかける
となります。






