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

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






