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

悲観的ロック

pointこの用語のポイント

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

point「ダブルブッキングする可能性が高い(低くない)」や「ダブルブッキングしたらヤバい」という想定になっているやつだよ

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

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

スポンサーリンク

簡単に書くよ

悲観的ロック(読:ヒカンテキロック 英:pessimistic locking)とは

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

「ダブルブッキングはダメ。ゼッタイ。」になっているロックのこと
です。
もう少し具体的に書くと

「ダブルブッキングする可能性が低くないし、ダブルブッキングしたらヤバいよな。絶対にダブルブッキングしないようにしておくか」と悲観的に考えて設計されているロックのこと
です。


image piyo

詳しく書くよ

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

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

悲観的ロック

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

悲観的ロック2

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

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

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

悲観的ロック3

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

悲観的ロック4

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

悲観的ロック5

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

悲観的ロック6

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

悲観的ロック7

この話におけるピヨ子さんの考え方

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

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

悲観的ロック8

あと、ついでなので書いておくと、ピヨ太君の考え方

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

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

悲観的ロック9

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

例えば、そうですね。

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

悲観的ロック10

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

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


です。

今回は

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


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

悲観的ロック11

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

悲観的ロック12

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

悲観的ロック13

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

悲観的ロック14

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

悲観的ロック15

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

悲観的ロック16

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

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

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

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

悲観的ロック17

ピヨ太君は、この時点ではロックしません。
そのまま取り出した値に1を足します。
値は「2」になりました。

悲観的ロック18

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

悲観的ロック19

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

悲観的ロック20

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

悲観的ロック21

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

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

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

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

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

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


です。

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

ちょっと休憩6

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

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

設計思想

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

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

ただし

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


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

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


image piyo2

一言でまとめるよ

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

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

おまけ

■訳してみるよ

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

悲観的に錠をかける

となります。




書籍画像
わわわ説明術コラム
宣伝だよ
実務で役立つ ログの教科書 基礎知識から収集方法・分析手法・トラブルシューティング・パフォーマンス最適化・機械学習での活用まで
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
AI用語図鑑 ビジネス・開発・試験対策に使える厳選キーワード256