お客がシャトー・マルゴーを1本購入すると、店番は次の2つの作業を行います。
この時、「売り上げノートには記録したのに、在庫を減らし忘れる」というミスが発生する可能性があります。こうなると、「在庫があると思ったが、実際には商品がない」ということが起こり得ますね。
データベースでは、このような中途半端状態を防ぐため、(1)と(2)の一連の処理をひとまとめに扱い、「全部成功する(処理が成功して、データを更新する)」か「全部やり直す(失敗したため、元のままの状態にする)」かのどちらかを行うように制御します。これがAtomicity(原子性)であり、「これ以上、分割できない(分割してはならない)」処理の単位のことをいいます。
在庫数を考えると、「在庫は0以上の数値になる」というルールがありますね(表3)。
| 商品名 | 価格 | 在庫数 |
|---|---|---|
| シャトー・マルゴー | 7000円 | −1 |
| 表3 在庫マイナスのケース | ||
基本的に、商品の在庫がマイナスになることはないため、在庫は必ず0以上です。データベースでは、このような事前定義したルールを逸脱する更新が発生した場合、その処理自体を拒否します。これをConsistency(一貫性)といいます。
在庫が残り1本しかないシャトー・マルゴーを、2人のお客がほぼ同時に購入するケースを考えます(図1)。
図1の場合、どちらかが商品を購入できないため、トラブルに発展しそうですね。フリーマーケットでは、店番が丸く収めて終わりそうですが、コンピュータでは同時に処理が走ると、以下のような順序で在庫以上の本数が売れる可能性があります。
結果、在庫が1本ですが、AさんとBさんの両方の注文が成立します。この場合、どちらかのお客に謝罪した上で、その注文をキャンセルする必要が出てきます。
データベースでは、内部で処理の順番を制御し、結果として矛盾なく1人分しか購入できないように処理します。例えば、「Aさんの処理が確定するまではBさんの処理を待たせる」などが考えられるでしょう。
このように、複数の処理を同時に実行しても、矛盾なく処理することをIsolation(独立性)といいます。
Copyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク
よく読まれている編集記者コラム