排他制御って大切 −技術解説−
1.「排他制御」ってご存知ですか?
技術的な話です。
ある処理をする時、他に処理させずに自分だけで(排他)で実行したい
ことがあります。DBのレコード排他などが有名です。
2.「排他制御」をもう少し詳しく
EXCELを複数人で共有して修正するなんてことはありませんか?
「排他制御」があるから出来るんです。
WORDなどは複数人で共有・修正出来ませんよね。うまく「排他」が
出来ないからです。
便利そうですが、業務システム等ではどの様に使われるんでしょう?
更新系のでDBのデータを適正に保つ為には必須です。
なぜって、下記だからなんです。
① 今のコンピュータシステムはマルチプロセス
同時に、幾つもの処理が実行される。
② 処理の途中で実行していた処理の切替わりが発生する。
これだけだと分かりにくいですね
少しイメージで説明します。
ある普通口座で、「振込」と「引き落とし」の処理が同時に
実行されたとしましょう。普通に想定される問題ないケース。
① もともと10万円あった。
② 10万円引き落とされる。
10−10=0円
③ 20万円振り込まれる。
0+20=20万円
順番通り処理されるので、20万円ですね。
ここで、②の処理が途中で③に追い抜かれたらどうでしょうか?
細かいですが、以下の通りです。
① もともとの金額(10万円)を確かめる。
② 10万円の引き落とし処理が始まる。
注:ここで、処理が追い越されます。
③ 20万円振り込未処理が始まります。
②―1 口座の残金(10万円)を確認する。
②―2 残金を確認する。(10万円なので引き落とせる)
②―3 引き落とし結果を計算する。
10−10=0円
(まだ結果が書き込まれていません。)
③―1 口座の残金(10万円)を確認します。
③―2 振込後の金額を計算します。
10+20=30万円
③―3 振込結果(30万円)を口座に書き込みます。
注:ここで、引き落とし処理が戻ってきます。
②―4 引き落とし結果(0円)を口座に書き込みます。
はい、口座の残金は「0円」です。
個々の処理は間違っていませんが、処理する順番が狂ってます。
「②」の処理中に他の処理が割り込まないように、
その口座に「排他」をかけます。
また、細かいですが、以下のとおりです。
① もともとの金額(10万円)を確かめる。
☆ ②の処理をするため該当口座を「排他」します。
② 10万円の引き落とし処理が始まる。
☆ ③の処理をするため該当口座を「排他」します。
か、②処理中で当該口座が「排他中」なので、
「排他」出来ません。=>処理を待ちます。
②―1 口座の残金(10万円)を確認する。
②―2 残金を確認する。(10万円なので引き落とせる)
②―3 引き落とし結果を計算する。
10−10=0円
(まだ結果が書き込まれていません。)
③ 20万円振り込未処理が始まりません。
②―4 引き落とし結果(0円)を口座に書き込みます。
☆ ②の処理で該当口座「排他」を終了(開放)します。
「排他」を待っていた③が「排他」を取った上で、
処理を開始します。
③ 20万円振り込未処理が始まります。
③―1 口座の残金(0万円)を確認します。
③―2 振込後の金額を計算します。
0+20=20万円
③―3 振込結果(20万円)を口座に書き込みます。
はい、口座の残金は「20万円」です。ちゃんと出来ます。
3.「排他」の裏読み
前半長々と書きましたが、「排他制御」は重要かつ必要です。
サポートよろしくお願いします。ご感想、ご希望などいただければ嬉しいです