「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

楽観的ロック

pointこの用語のポイント

pointロックのやり方の分類だよ

point「ダブルブッキングする可能性は低い」や「ダブルブッキングしても、そこまでヤバくない」という想定になっているやつだよ

point具体的なやり方は、いろいろあるっぽいよ

point「悲観的ロック」の逆だよ

スポンサーリンク

簡単に書くよ

楽観的ロック(読:ラッカンテキロック 英:optimistic locking)とは

「これは今、俺が使ってるからさ。他の人は触らないでね」にすること(ロック)の分類のひとつ
であり

「ダブルブッキングしたらドンマイ!」になっているロックのこと
です。
もう少し具体的に書くと

「多分ダブルブッキングしないし、仮にダブルブッキングしてもそこまでヤバいことにはならないから、もしダブルブッキングしたら諦めるわ」と楽観的に考えて設計されているロックのこと
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として「排他制御」と「ロック」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

排他制御は「ダブルブッキングしないようにすること」です。
同時に使われるとマズい(おかしくなる)ものに組み込む仕組みで、1つの物を同時に使わせないための工夫です。

楽観的ロック

今回 登場するロックは「これは今、俺が使っているからさ。他の人は触らないでね」です。
鍵をかければ、他の人は使えないですよね?
そのような状態、もしくは、そのような状態にする行為です。

楽観的ロック2

ロックは排他制御を実現する手段のひとつです。

以上を踏まえて、本題に入ります。

ある日のことです。
ピヨ太君とピヨ子さんでピヨピヨシステムを作ることにしました。

楽観的ロック3

ピヨピヨシステムではダブルブッキングする可能性がある処理をやります。
ロックの仕組みを入れておきましょう。

楽観的ロック4

ピヨ太君とピヨ子さんは「どんな仕組みでロックする?」を話し合いました。

楽観的ロック5

ピヨ太君は「ダブルブッキングする可能性は低いし、もしダブルブッキングしてもそこまでヤバいことにはならないよね。必要最低限のロックにしようよ」と言いました。
「ダブルブッキングしたらドンマイ!」案です。

楽観的ロック6

ピヨ子さんは「ダブルブッキングしたらマズいでしょ。ダブルブッキングしないように、しっかりとロックするわよ」と言いました。
「ダブルブッキングはダメ。ゼッタイ。」案です。

楽観的ロック7

この話におけるピヨ太君の考え方

「ダブルブッキングする可能性は低いし、もしダブルブッキングしてもそこまでヤバいことにはならないよね。必要最低限のロックにしようよ」に沿って作られたロック

が「楽観的ロック」です。

楽観的ロック8

あと、ついでなので書いておくと、ピヨ子さんの考え方

「ダブルブッキングしたらマズいでしょ。ダブルブッキングしないように、しっかりとロックするわよ」に沿って作られたロック

は「悲観的ロック」と言います。

楽観的ロック9

楽観的ロックや悲観的ロックは「こんな考えで設計してあるよ」を表す用語です。
具体的なやり方は(多分)いろいろ あります。

例えば、そうですね。

ピヨ太君がデータベースに入っているデータを更新しようとしています。

楽観的ロック10

データベースに入っているデータを更新するときの一般的な流れは

1.該当するデータを取り出す
2.取り出したデータを加工する
3.加工した内容で更新する


です。

今回は

1.データベースに入っている値(数字)を取り出す
2.取り出した値に1を足す
3.「取り出した値に1を足した値」でデータベースの元の値を更新する


処理をやることにします。

楽観的ロック11

ピヨ太君はデータベースに入っている値を取り出します。
値は「1」でした。

楽観的ロック12

取り出した値に1を足します。
値は「2」になりました。

楽観的ロック13

ピヨ太君は「2」で更新し……ようと思いましたが、もし他の人に更新されていたらマズいので、もう一度同じデータを取り出してみました。
今度は「5」が出てきました。

楽観的ロック14

どうやら、ピヨ太君があれこれしている間に誰かが「1」から「5」に更新してしまったようです。
この状況で、ピヨ太君が値を「2」に更新したら、おかしなことになりそうですね。

楽観的ロック15

ピヨ太君は更新しようと思っていた「2」を捨てました。

楽観的ロック16

ピヨ太君は「多分ダブルブッキングしないでしょ」と考え、データを取り出した時点ではデータベースをロックしませんでした。

データを更新する直前に「データが変わっていないかな?」を確認しました。
実際にロックしたわけでは ありませんが、これがロックに相当する処理です。

データが変わっていたので更新するのを止めました。
変わっていなかったら更新したはずです。

このようなやり方が楽観的ロックの一例です。

おっと、今のピヨ太君と同じ処理をピヨ子さんもやろうとしているようです。
せっかくなので、見てみましょう。

ピヨ子さんはデータベースに入っている値を取り出しました。
値は「1」でした。

楽観的ロック17

ピヨ子さんは、この時点でロックします。
データベースに「ピヨ子が使用中。他の人は触らないでね」と張り紙をしました。

楽観的ロック18

次に、取り出した値に1を足します。
値は「2」になりました。

楽観的ロック19

ピヨ子さんは「2」でデータベースを更新します。
ロックしているので他の人は触っていません。
おかしなことにはならないはずです。

楽観的ロック20

これで更新は終わりです。
ピヨ子さんは「ピヨ子が使用中。他の人は触らないでね」の張り紙を外しました。

楽観的ロック21

ピヨ子さんは「ダブルブッキングしたらマズいわね」と考え、自分が使い始める時点でロックしました。
使い終わった時点でロックを解除しました。

このようなやり方が悲観的ロックの一例です。

せっかくなので併せて覚えてあげてください。

楽観的ロック:「ダブルブッキングしたらドンマイ!」ロック
悲観的ロック:「ダブルブッキングはダメ。ゼッタイ。」ロック


です。

以上で楽観的ロック(と悲観的ロック)の大雑把な説明は終わりですが、もう少しだけ、専門用語をガッツリ使った補足説明をしておきます。
気が向いたら読んでやってほしいのですが、ある程度の専門用語がないと分からない話です。
読んで分からなかった人は「まだ自分には早いな」と判断して、理解することを未来の自分に託してください。

ちょっと休憩

それでは、いってみましょう。

私の理解では、楽観的ロックや悲観的ロックは

設計思想

です。
必ずしも具体的なやり方を指す用語ではないと解釈しています。

例えば、SQLにおいて、select文の最後に「FOR UPDATE」を付けると悲観的ロックになります。

ただし

1.データを取得(select文を実行)
2.あれやこれやの処理
3.「1」の状態からデータが変わってないか確認するためにデータ取得(「FOR UPDATE」付きのselect文を実行)
4.データ更新update文を実行)


のような処理をやったら、全体としては楽観的ロックですよね?

そのため、機械的に「このSQL文に『FOR UPDATE』が付いているから、この処理は悲観的ロックだな」とか考えていると、思わぬミスをする可能性があります。
ご注意ください。


image piyo2

一言でまとめるよ

まぁ「楽観的ロック」って単語が出てきたら「『ダブルブッキングしたら諦めるわ』な考えで作られているロック(「これは今、俺が使ってるからさ。他の人は触らないでね」にすること)なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像026
書籍画像030

おまけ

■訳してみるよ

「楽観的」は日本語ですね。
「lock(ロック)」の意味は「錠前」とか「錠を掛ける」とか「閉じ込める」とか「固定する」とか「動けなくする」とかです。
何となく くっつけると

楽観的に錠をかける

となります。




書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
おい点P、動くんじゃねえ!──ニガテ民のための算数と数学の本
AI用語図鑑 ビジネス・開発・試験対策に使える厳選キーワード256