「分かりそう」で「分からない」でも「分かった」気になれる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

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

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

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

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

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

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


です。

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

ちょっと休憩5

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

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

設計思想

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

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

ただし

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


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

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


image piyo2

一言でまとめるよ

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

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

おまけ

■訳してみるよ

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

悲観した錠をかける

となります。




書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
実務で役立つ バックアップの教科書 基本の考え方からツール活用・差分管理・世代管理・データ保全・リストア・リカバリー・可用性の確保まで
7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性