ホーム 第10章 · データベース
第10章 · テクノロジ

最後の一個を、二つの受注へ割り当ててしまった。

利用者の移行データには同姓同名の人がいた。受入テストでは最後の一個に二つの「引当完了」が出た。葵は初めて、自分から試行への移行を止める判断を求めます。

4つのテーマ17項目16の図解
この章の目次・学習項目

この章も、新卒コンサルタントの葵と先輩の佐伯が、大手メーカー「アステラ製作所」の受注・生産・出荷をつなぐ案件に取り組みます。

会話と図解で読み進め、詳しい説明は各項目で開けます。

01
名簿を作っただけでは、同じ人を見分けられない

同じ名前の人を、同じ利用者にしてしまうところだった

行を識別し、表同士の関係を保つ。

移行テスト|既存の利用者と受注データ

移行データには、同じ「山田太郎」という名前が二行あった。葵は重複だと思いかけたが、所属と利用者IDが違っていた。

新卒ITコンサルタント

同じ名前だけでは、同じ人だと決められませんね。

小野
生産管理責任者

拠点が違う別の方です。異動したときに名前だけで照合されても、困ります。

井上
開発会社のPM

変更しても同じ人を追える識別子と、所属の関係を確認しましょう。

データベース・DBMS

表計算を共有する案から、同時更新や権限を管理する仕組みへ話が進んだ。葵はデータとDBMSの役割を分けて確認した。

データベースは整理したデータの集まり。DBMSは、その保存・検索・更新などを管理するソフトウェア。

01DBMSが、データの利用を支える
操作検索・追加・更新・削除
同時実行複数の処理を整合的に進める
障害回復障害後にデータを復旧する
権限管理誰に何を許可するか制御
詳しい説明・条件・具体例

データベースは、データを整理・蓄積し、必要に応じて取り出せるようにしたものです。関係データベース(RDB)は表の形で扱います。階層型、ネットワーク型、キー・バリュー型、ドキュメント型、カラム型などのNoSQLデータベースもあります。

DBMS(Database Management System)は、データベースを管理するソフトウェアです。関係データベースを管理するものをRDBMSと呼びます。データと管理ソフトは、別の概念です。

小野
生産管理責任者

表を共有するだけでは、足りないのでしょうか。

新卒ITコンサルタント

同時に更新する人が増えるので、競合や権限、障害からの復元も考えたいです。データを管理するDBMSの役割が関わります。

井上
開発会社のPM

保存できることに加えて、複数人が使ったときの動きまで確かめましょう。

テーブル・レコード・フィールド

一行が一人なのか、一回の注文なのか。葵は表の単位と列の意味を先に決めた。

表がテーブル、1件分の行がレコード、名前や価格などの列がフィールド。

02一人分が一行、情報の種類が列
利用者ID名前所属拠点
M01山田太郎東工場
M02鈴木花子本社
M03山田太郎本社
表(テーブル)
同じ種類の情報を集めた表。
行(レコード)
一人、一件など、一つの記録に対応するまとまり。
列(フィールド)
利用者ID、名前など、情報の項目。
詳しい説明・条件・具体例
表(テーブル)
同じ種類の情報を集めた表。データベース内には複数の表を持てます。
行(レコード)
一人、一件など、一つの記録に対応するまとまり。
列(フィールド)
利用者ID、名前など、情報の項目。

表計算の見た目に似ていますが、列ごとのデータ型、キー、制約、同時更新などを管理できる点に注目します。

高橋
経理担当

この「件数」は、注文した人数ですか、注文の回数ですか。

新卒ITコンサルタント

一行を一回の注文としているので、同じ方の二回目は別の行です。人数とは違いますね。

高橋
経理担当

分かりました。その違いが表題にもあると、集計を見る人が迷わずに済みます。

新卒ITコンサルタント

一行の単位と、各列の意味をデータ辞書にも残します。

主キー

同姓同名、名前の変更、未入力。葵は名前を主キーにしたときに困る場合を挙げた。

各行を一意に特定する目印。値は重複せず、NULLも不可。名前が同じ人でも区別できる。

03一列で足りないなら、組み合わせる
主キーの例利用者ID
同姓同名でも区別できる
複合主キーの例設備ID+使用日
同じ設備の別日の利用を区別する
詳しい説明・条件・具体例

主キーは、表の各行を一意に特定するために選んだ列、または列の組です。一つの表に指定する主キーは一組で、一意性制約非NULL制約を満たします。

主キーの値は重複できず、NULLにもできません。NULLは値が不明・存在しないなどを表すもので、数値0や空文字とは区別します。表を作ると自動で必ず主キーが設定されるわけではなく、適切な設計が必要です。

新卒ITコンサルタント

一意で、空にはできない目印が必要ですね。一列で足りなければ、組合せを使う理由も業務から確認します。

外部キー

利用者データの所属先に、拠点表にはない番号が入っていた。葵は修正する人と、再発を防ぐ制約を相談した。

別の表の主キーなどを参照し、表同士を結び付ける。参照先にない値を防ぐ制約に使う。

04拠点IDを使って、名前を参照する
拠点ID拠点名
01本社
02東工場
03西工場
詳しい説明・条件・具体例

利用者表に拠点IDを持たせ、拠点表の主キーを参照させると、表同士の関係を保てます。この参照する側が外部キーです。外部キーは複数設けることも、設けないこともあります。

参照整合性制約により、例えば存在しない拠点ID「99」を勝手に登録しないようにできます。参照先は主キーや一意なキーです。NULLを許可するかは設計によるため、外部キーもすべて非NULLとは限りません。

井上
開発会社のPM

拠点表にない番号が、所属拠点へ入っています。移行前に確認したいです。

小野
生産管理責任者

統廃合した拠点の番号かもしれません。元の記録を調べます。

新卒ITコンサルタント

修正した後も、同じ関係が崩れないようにしたいです。外部キーの制約で守る範囲を確認しましょう。

井上
開発会社のPM

はい。画面で気を付けるだけでなく、データ側でも参照整合性を保つように考えます。

関数従属性・正規化

拠点名を変えるたびに、利用者の多数の行を直す設計になっていた。葵は同じ事実をどこで管理するかを問い直した。

「拠点コードが決まると拠点名が決まる」のような関係を見つけ、同じ情報の重複を整理する。

05同じ事実は、一か所で管理する
依存関係を見つける拠点ID → 拠点名
別の表へ分ける拠点IDと拠点名を取り出し、重複する組をまとめる
元の表にはIDを残す拠点名は必要なときに参照する
詳しい説明・条件・具体例

利用者の各行に拠点IDと拠点名を両方保存すると、拠点名変更で多数の行を直す必要があり、修正漏れが起きやすくなります。拠点IDが決まれば拠点名が決まるという関係に注目します。

こうすれば、名前の変更は拠点表の一行で済みます。分ければ分けるほどよいのではなく、意味上の依存関係を保って、矛盾なく結び直せる分割にすることが大切です。

小野
生産管理責任者

拠点名を一か所直したのに、古い名前がまだ出ます。全部探して直すのでしょうか。

新卒ITコンサルタント

同じ拠点名が利用者の行ごとに入っていますね。拠点IDに対応する名前を、拠点表で管理する設計へ戻して相談します。

小野
生産管理責任者

一つの変更で済めば、直し忘れも減らせそうです。

新卒ITコンサルタント

はい。同じ事実をどこで管理するかが、後の手間に効いてきます。

利用者、拠点、注文を結ぶ番号と制約が決まった。葵は、例外データを勝手に補わず、顧客が判断する一覧へ分けた。きれいに見える移行結果より、正しい関係を保つことを選べた。

ちょっと考えてみよう同姓同名の人がいる利用者表で、名前を主キーにしてよい?考え方をひらく +

通常は適切ではありません。一意性を保証できないためです。重複しない利用者IDなどを設計します。

02
ほしいデータを、ほしい形で取り出す

抽出した人数が、依頼した人数と違う

条件と表の操作を、結果で確かめる。

移行確認|対象データの抽出

条件に合う人だけの一覧を頼んだのに、想定より多くの行が出てきた。葵はDBの不具合かと思ったが、自分の依頼文に「かつ」と「または」が混ざっていた。

井上
開発会社のPM

この条件は、どちらかを満たせば対象ですか。それとも、両方を満たした人だけでしょうか。サンプルで合わせたいです。

新卒ITコンサルタント

開発側の問題だと決めつけていました。期待する行を小さな例で示して、条件をそろえます。

選択・射影・結合

行を絞る、列を選ぶ、表をつなぐ。葵は依頼する操作を分けて説明した。

選択は条件に合う行、射影は必要な列を取り出す。結合は共通する項目などで表をつなぐ。

06どの方向へ、データを絞る?
選択条件に合う行を取り出す
射影必要な列を取り出す
結合対応する値などで表を結び付ける
詳しい説明・条件・具体例

「東工場の利用者だけ」は選択、「利用者IDと名前だけ」は射影、「拠点IDを使って拠点名を付ける」は結合です。SQLのSELECTという単語と、関係演算の選択を、そのまま一対一で同じ意味にしないようにします。

高橋
経理担当

今月の注文について、拠点名と合計金額だけ見たいです。

新卒ITコンサルタント

対象の行を選択し、必要な列を射影します。拠点名は拠点表と結合し、拠点ごとの合計金額は集計して求めます。

井上
開発会社のPM

その分け方なら、必要な抽出を確認できます。期間や結合するキーも合わせましょう。

新卒ITコンサルタント

「表をまとめてください」より、何をしたいかを具体的に伝えられますね。

和集合・積集合・差集合

二つの一覧で共通する人、片方だけの人、合わせた全員を確認する。葵は和、積、差の向きを分けた。

両方を合わせる、両方にあるものを選ぶ、片方からもう片方を除く。差集合は引く向きに注意。

07両方・共通・片方だけ
演算結果
和集合 A∪B佐藤、田中、鈴木、高橋
積集合 A∩B田中、鈴木
差集合 A−B佐藤
差集合 B−A高橋
詳しい説明・条件・具体例

同じ列構成で対応する値を比較できる表なら、集合としての演算を行えます。A={佐藤、田中、鈴木}、B={田中、高橋、鈴木}で考えます。

和集合では重複する同じ行を一つにまとめます。差集合は順序を逆にすると結果も変わります。SQLではUNIONとUNION ALLのように、重複を除くか残すかを分ける記法もあります。

移行前後の差分を調べるときも、どちらからどちらを引いたのかを記録する。重複の扱いも、結果に大きく関わった。

SQL・AND・OR

小さな学生の表で、80点以上と20歳未満をAND・ORで結んだ結果を確かめた。これは条件を検算するための練習で、顧客の情報とは分けて扱う。

SQLでデータを検索・更新する。ANDは両条件、ORは少なくとも一方の条件を満たす場合。

08年齢と得点の例
氏名年齢点数
山田花子1885
佐藤太郎1978
情報次郎2092
基本三郎1868
中村優衣2181
SELECT 氏名, 点数
FROM 学生
WHERE 点数 >= 80 AND 年齢 < 20;
詳しい説明・条件・具体例

実際に残る人を確かめる

  1. 点数80以上:山田花子、情報次郎、中村優衣。
  2. 点数80以上、かつ年齢20未満:山田花子だけ。
  3. 点数80以上、または年齢20未満:この例では5人すべて。

SELECTの後は取り出す列、FROMの後は対象の表、WHEREの後は条件です。SQLは検索だけでなく、INSERTによる追加、UPDATEによる更新、DELETEによる削除などにも使います。

新卒ITコンサルタント

この練習表では、ANDなら山田花子だけ、ORなら全員になりました。言葉一つで、ここまで変わるんですね。

井上
開発会社のPM

実行結果を見たら、期待していた行と照合しましょう。エラーが出ないSQLでも、条件が違うことはあります。

新卒ITコンサルタント

80点以上と20歳未満のように、両方が必要なのかを先に確認します。この学生の例と顧客データも、混ぜないようにします。

LIKE・ワイルドカード

末尾が一致する人を探す条件で、パターンの位置を確認した。葵は「含む」と「終わる」を同じ意味にしないようにした。

文字列のパターンで検索する。%は0文字以上の任意の文字列、_は任意の1文字を表す。

SELECT 氏名
FROM 学生
WHERE 氏名 LIKE '%子';
詳しい説明・条件・具体例

完全一致ではなく、指定したパターンに合う文字列を探す方法が、あいまい検索です。SQLのLIKEなどでは、%を0文字以上の任意の並びに使います。

上の表なら山田花子が該当します。「%太郎」には、山本太郎、佐藤一太郎、太郎が一致しますが、山本太郎ノ介や佐藤次郎は一致しません。%は途中も含めて何でもよいという意味ではなく、置いた位置で働きます。多くのSQLで「_」は任意の1文字を表します。

小野
生産管理責任者

「子」で終わる名前を探したいのに、途中に入る人も出てきました。

新卒ITコンサルタント

「含む」と「終わる」で、パターンの位置が違いますね。指定を見直します。

小野
生産管理責任者

候補が出たら、同じ人としてまとめてよいですか。

新卒ITコンサルタント

そこは別の確認が必要です。検索で候補を見つけたことだけでは、同一人物とは判断できません。

抽出条件、対象列、突き合わせるキーを、サンプルの結果と一緒に合意した。SQLを少し読めるだけで、葵は依頼と結果のどちらに食い違いがあるかを確かめやすくなった。

ちょっと考えてみよう名前と価格の列だけ取り出すのは選択? 射影?考え方をひらく +

列を取り出すので射影です。価格が300円以上の行だけを残す処理は選択です。

03
一つの表へ詰め込まず、意味で分ける

商品が四つなら、列も増やしますか

重複と依存関係から、データの構造を見直す。

設計レビュー|注文と明細の関係

試作の受注明細には「商品1」「商品2」「商品3」という列が並んでいた。葵は、小野が見せた二十品目の注文書と見比べた。

新卒ITコンサルタント

四品目目が来るたびに列を増やす設計では、受注のたびに表の形を変えることになりますね。

井上
開発会社のPM

一つの注文と、その中の一品目を分けて考えてみましょう。

新卒ITコンサルタント

受注そのものの情報と、品目ごとの数量を明細として持たせるんですね。

正規化

繰返す列や、一つのセルに詰めた複数の値を、葵は注文の例で確かめた。

同じ事実の重複や、更新時の矛盾を減らす。1つのセルへ複数の商品を詰めず、明細の行へ整理する。

09繰返し項目を、明細の行にする
注文ID商品ID数量
O01P012
O01P021
O02P011
詳しい説明・条件・具体例

正規化は、依存関係などに基づいて表を設計し、重複や更新時の矛盾を減らす方法です。保守性と整合性を高めます。

一つのセルへ複数の商品を詰めたり、商品1・商品2と列を繰り返したりせず、商品ごとの明細へ整理します。生年月日と現在年齢のように計算で得られる値は、両方を持つと更新漏れを招きます。ただし「契約時年齢」のように過去の事実として意味が違う値は、目的を確認して扱います。

正規化は、表を細かくすること自体が目的ではない。追加・修正・削除で矛盾が起きにくくするためだと、顧客へ説明した。

第一正規形・第二正規形・第三正規形

何が決まれば何が決まるかを、学生・学部・科目・履修の例で追う。葵は同じ関係の考え方を、注文と商品へ戻した。

繰返し項目、主キーの一部への依存、非キー項目を経由する依存を、段階的に整理する。

10注文と商品も、明細で結び付ける
注文と商品は多対多なので注文明細を間に置く。注文から注文明細は1対多、商品から注文明細も1対多。注文商品注文明細注文ID+商品ID11
同じ注文で同じ商品を一行にまとめる設計例。明細番号を主キーにする設計などもあります。
詳しい説明・条件・具体例

学生と履修科目を整理する

  1. 学籍番号から、氏名・生年月日・学部コードが決まるので、学生表へまとめる。
  2. 学部コードから学部名が決まるので、学部表へ分ける。
  3. 科目コードから科目名が決まるので、科目表へ分ける。
  4. 学生が履修する科目は複数あるため、学籍番号+科目コードの履修表を作る。

複合キーの一部だけで決まる情報や、キー以外の列を経由して決まる情報を整理します。第一正規形では繰返しをなくし、第二正規形では部分関数従属、第三正規形では推移的な関数従属を整理する、と理解するとつながります。

依存関係を見つけると、どこに置く情報かが分かる。計算できる値でも、過去の事実として残す目的がある場合は別に確認した。

ER図

主担当の所属を一つ持つことと、複数拠点を兼務することは別の関係だ。葵は単純な所属表の例から、実際の業務ルールへ戻った。

管理する対象と、その関係を描く。1対多などの対応を確かめてから、表を設計する。

11一つの部署に、複数の従業員
部署と従業員の1対多の関係。各従業員は一つの部署に所属するという業務ルールの例。部署部署ID従業員従業員ID1一つの部署に、複数の従業員
詳しい説明・条件・具体例

ER図は、実体(Entity)と関連(Relationship)で対象の世界を表す図です。実体は人、モノ、出来事など、管理したい対象。表として実装する前に、何をどう結び付けるかを考えます。

多重度は、一方の一件に対して、他方が何件対応するかを示します。1対1、1対多、多対多があります。図の線の端に付く記号は、相手側の件数として読みます。

両側から、別々に読む

  1. 従業員一人に注目:この設計では一つの部署に所属する。
  2. 部署一つに注目:複数の従業員が所属し得る。
  3. 兼務や無所属を認めるなら、業務ルールに合わせて関連や最小数も変える。
新卒ITコンサルタント

主所属は一つですが、応援で複数工場を担当する人もいますか。

小野
生産管理責任者

います。異動手続の途中で、応援先がまだ決まっていない人もいます。

葵は図の片側だけを見ていたことに気付いた。

新卒ITコンサルタント

一人が担当する拠点数と、一拠点の担当人数を両方確認します。0件を許すかも必要ですね。

井上
開発会社のPM

その関係は、主所属とは分けて設計しましょう。

注文、商品、明細の関係が整理された。葵はER図を顧客へそのまま渡すのではなく、「一つの注文に何品入るか」を確認する会話に使った。図を描く人と、仕事を知る人の間をつなげられた。

ちょっと考えてみよう一人の学生が複数科目を取り、一つの科目に複数学生がいる。この関係は?考え方をひらく +

多対多です。関係データベースでは「履修」などの中間表を置き、学生→履修と科目→履修をそれぞれ1対多にして扱えます。

04
最後の一個を、二人が同時に受注したら?

最後の一個に、二つの納期回答を出してしまった

同時更新と障害時にも、業務の約束を守る。

受入テスト|二台の端末で在庫の同時引当

在庫が一個の品目で、二つの取引先の受注を同時に登録した。二台の画面が、両方とも「引当完了」と表示した。

小野
生産管理責任者

本番なら、この数量を前提に営業が納期を答えてしまいます。片方には届けられません。

葵は試験結果に「画面表示は正常」と書きかけた手を止めた。

新卒ITコンサルタント

このまま試行へ進めることはできません。在庫の確認と割当てが、同時に動くときにどうなるかを調べてください。

井上
開発会社のPM

ログを確認します。一人ずつ操作する試験では見えていなかった競合ですね。

佐伯
先輩ITコンサルタント

業務の約束に照らして止める理由を説明できたね。修正後に何を確かめるかも、一緒に決めよう。

トランザクション

在庫を確保する処理と、受注を記録する処理が片方だけ終わったらどうなるか。葵は銀行の送金例でも、二つで一組の意味を確かめた。

複数の処理を、まとめて一つの仕事として扱う。途中だけ成功した状態を残さない。

121万円の送金は、二つの更新で一組
送り手30,000円 → 20,000円
受け手50,000円 → 60,000円
詳しい説明・条件・具体例

トランザクションは、一つの業務上の処理として扱う操作のまとまりです。送金なら、送り手の残高を減らす処理と、受け手の残高を増やす処理を一組にします。

片方だけ実行されると、お金が消えたり増えたりしてしまいます。「すべて成功するか、一切実行されなかった状態に戻るか」を保証する性質が原子性です。受注でも、在庫の確保と受注記録を矛盾なく扱う必要があります。

トランザクションの範囲は、業務で一つの約束になる範囲でもある。葵は途中で失敗する場合を、テストへ加えた。

ACID特性

全部行うか、制約を守るか、同時実行で干渉しないか、確定後に残るか。ACIDを、葵は四つの確認へ置き換えた。

原子性・一貫性・独立性・耐久性。途中失敗、ルール違反、同時処理、確定後の消失に備える。

13トランザクションの基本
A|原子性全部実行するか、全部取り消す
C|一貫性前後で制約・整合性を保つ
I|独立性同時実行の干渉を制御する
D|永続性確定した結果を失わない
詳しい説明・条件・具体例

AはAtomicity、CはConsistency、IはIsolation、DはDurability。コミットで変更を確定し、失敗した処理は取り消します。これらの性質はDBMSのログや同時実行制御などによって支えられ、最後にコミット命令を書くだけで無条件にすべて保証されるものではありません。

独立性には分離レベルがあり、許す同時実行の振る舞いは設定で変わります。永続性を実現するにも、適切な構成、保存処理、障害への備えが必要です。

コミットがあるだけで、設定や設計に関係なく安全になるわけではない。分離レベルなど、実際の構成も井上へ確認した。

ロールバック

受注の途中で処理が失敗した場合、在庫だけ減ったままでは困る。葵はロールバックで、どの状態へ戻るかを確認した。

完了できなかった処理の更新を取り消し、開始前の状態へ戻す。

14戻すための記録を先に持つ
更新前の値を記録更新前ジャーナルなどを残す
データを更新複数の処理を進める
途中で失敗更新前の記録を使って取り消す
詳しい説明・条件・具体例

ロールバックは、失敗したり中断したトランザクションの変更を取り消し、実行前の整合した状態へ戻すことです。バックワードリカバリとも呼びます。

更新の前後を記録するジャーナルやログと、定期的なバックアップは別の役割を持ちます。実際のDBMSではログの形式や回復方式が異なりますが、前の状態へ戻すための情報が必要という考え方は共通です。

田中
物流担当

エラーが出たので、受注は入っていないと思いました。でも、在庫は一つ減っています。

新卒ITコンサルタント

表示だけでなく、更新がどこまで戻ったかを確認したいです。

井上
開発会社のPM

途中で失敗した処理をロールバックして、整合した状態に戻せているか調べます。

新卒ITコンサルタント

失敗のメッセージを確認して終わりにはしません。受注と在庫の両方を見ます。

ロールフォワード

障害で保存データを失ったとき、バックアップより後の確定済み注文をどこまで戻せるかを確認した。

バックアップを戻した後、更新の記録を使い、確定した処理を再び反映する。

15保存した時点から、確定済みの更新を再適用
バックアップを復元まず保存時点の状態へ戻す
更新後の記録を適用その後に確定した変更を順に反映する
回復可能な時点へ必要なログがそろった範囲まで復旧する
詳しい説明・条件・具体例

ロールフォワードは、バックアップと更新後ジャーナルなどを使って、失われた更新を再現することです。フォワードリカバリとも呼びます。障害直前まで戻れるかは、残っているログなどに依存します。

森川
事業部長

昨夜のバックアップへ戻せるなら、今朝の受注も残りますか。

新卒ITコンサルタント

バックアップだけでは、その後の更新は含まれません。確定した更新のログを使って、どこまで戻せるかを確認します。

井上
開発会社のPM

ロールフォワードに必要なログがそろう範囲と、復旧の手順を検証しましょう。

新卒ITコンサルタント

失う可能性のある情報も隠さずに、復旧条件として説明します。

排他制御・ロック・デッドロック

両方の処理が更新前の同じ値を読んでいた。葵は時系列の表を見て、在庫確認と確保の間に競合が入ることを理解した。

同時更新がぶつからないよう制御する。ただし、互いの解除を待って進めなくなる場合もある。

16排他制御で、順番を守る
段階処理A処理B
1対象をロック待つ
230,000→31,000待つ
3確定・ロック解放31,000を読む
4完了31,000→33,000を確定

井上が二つの処理のログを時刻順に並べた。

井上
開発会社のPM

在庫一個を、どちらも割り当てる前に読めていました。その後、両方が引当を確定しています。

新卒ITコンサルタント

操作する間隔を少しずらせば通る、では解決になりませんね。

佐伯
先輩ITコンサルタント

井上さん、今回どの範囲を一つの処理として守る案ですか。

井上
開発会社のPM

在庫の確認と確保の間に、別の処理が同じ一個を取れないようにします。待った側は、先の確定後の在庫で判断する案です。

葵はテスト票へ、同時操作と取消しの条件を書き足した。

新卒ITコンサルタント

一方だけが確定することと、確保できなかった受注をどう案内するか、両方を見ます。途中で失敗したときの数量も確認します。

小野
生産管理責任者

未確定の受注を、納期回答済みと混ぜないことも営業へ確認します。

稼働日を守ることだけでなく、取引先へ答える数量と納期を守ることが先だった。

詳しい説明・条件・具体例

残高30,000円へ、一つの処理が1,000円、もう一つが2,000円を加える例を考えます。両方が30,000円を読んでから書くと、31,000円または32,000円で上書きされ、一方の入金が消えることがあります。

排他制御は、ある処理が更新中のデータに対し、競合する別の処理を待たせるなどして矛盾を防ぐ仕組みです。同時実行制御には、ロック以外の方式もあります。最後の一個の受注も、在庫確認と確保を適切にまとめて制御します。

井上
開発会社のPM

二つの処理が、どちらも更新前の「残り一つ」を読んでいました。

新卒ITコンサルタント

在庫を確認してから確保するまでの間に、別の処理が入れるんですね。

田中
物流担当

一人ずつ試したときには、起きませんでした。

新卒ITコンサルタント

修正後は同時に操作する試験を残します。取消しや、残り0と1の境界も含めたいです。

井上
開発会社のPM

排他制御など、競合に合った対策を確認してから、一緒に試しましょう。

修正後、同じ条件で繰り返すと、一方の受注だけ引当が確定し、もう一方は在庫不足として納期の再確認へ戻った。途中失敗と復旧も確かめ、業務側へ結果を説明する。

小野
生産管理責任者

今度は、受け付けられなかった側にも分かる表示ですね。工場でどうご案内するかも、そろえておきます。

新卒ITコンサルタント

エラーが出なかったことだけでは、正しいとは言えませんでした。取引先との約束が、記録でも守られているかを見るんですね。

佐伯
先輩ITコンサルタント

そう。今回それを見つけたのは、葵さんのテストだよ。

ちょっと考えてみよう失敗した送金の片方の更新を取り消す操作は? バックアップへ更新を再適用する操作は?考え方をひらく +

前者はロールバック、後者はロールフォワードです。戻す方向と使う記録を区別します。

この章、おつかれさまでした!

「このまま稼働はできません」と言えた。

表の関係を保ち、抽出条件をそろえ、同時操作と復旧を確かめました。正しいデータを守ることは、取引先へ約束した数量と納期を守ること。次は、その情報が届く通信の道筋を追います。

この章を読み返す ↑
NEXT CHAPTER / 公開中11 ネットワーク
前の章へ · 第9章 システム構成