イチから全部作ってみよう(27)「ACID」で示されるデータベースの4つの特性山浦恒央の“くみこみ”な話(196)(2/3 ページ)

» 2025年12月17日 06時00分 公開

4.2 必ずまとめて処理する(原子性)

 お客がシャトー・マルゴーを1本購入すると、店番は次の2つの作業を行います。

  • (1)在庫数を20本から19本に減らす
  • (2)売り上げノートに7000円の売り上げを記載する

 この時、「売り上げノートには記録したのに、在庫を減らし忘れる」というミスが発生する可能性があります。こうなると、「在庫があると思ったが、実際には商品がない」ということが起こり得ますね。

 データベースでは、このような中途半端状態を防ぐため、(1)と(2)の一連の処理をひとまとめに扱い、「全部成功する(処理が成功して、データを更新する)」か「全部やり直す(失敗したため、元のままの状態にする)」かのどちらかを行うように制御します。これがAtomicity(原子性)であり、「これ以上、分割できない(分割してはならない)」処理の単位のことをいいます。

4.3 ルールを守る(一貫性)

 在庫数を考えると、「在庫は0以上の数値になる」というルールがありますね(表3)。

商品名 価格 在庫数
シャトー・マルゴー 7000円 −1
表3 在庫マイナスのケース

 基本的に、商品の在庫がマイナスになることはないため、在庫は必ず0以上です。データベースでは、このような事前定義したルールを逸脱する更新が発生した場合、その処理自体を拒否します。これをConsistency(一貫性)といいます。

4.4 同時には購入できない(独立性)

 在庫が残り1本しかないシャトー・マルゴーを、2人のお客がほぼ同時に購入するケースを考えます(図1)。

図1 図1 2人のお客がほぼ同時にシャトー・マルゴーを購入するイメージ

 図1の場合、どちらかが商品を購入できないため、トラブルに発展しそうですね。フリーマーケットでは、店番が丸く収めて終わりそうですが、コンピュータでは同時に処理が走ると、以下のような順序で在庫以上の本数が売れる可能性があります。

  • (1)お客Aさんが、シャトー・マルゴーの現在の在庫数を「1本」を読み込む
  • (2)ほぼ同時に、お客Bさんが、シャトー・マルゴーの現在の在庫数「1本」を読み込む
  • (3)お客Aさんは、在庫1本として購入処理を進める
  • (4)お客Bさんも、在庫1本として購入処理を進める

 結果、在庫が1本ですが、AさんとBさんの両方の注文が成立します。この場合、どちらかのお客に謝罪した上で、その注文をキャンセルする必要が出てきます。

 データベースでは、内部で処理の順番を制御し、結果として矛盾なく1人分しか購入できないように処理します。例えば、「Aさんの処理が確定するまではBさんの処理を待たせる」などが考えられるでしょう。

 このように、複数の処理を同時に実行しても、矛盾なく処理することをIsolation(独立性)といいます。

Copyright © ITmedia, Inc. All Rights Reserved.

特別協賛PR
スポンサーからのお知らせPR
Pickup ContentsPR
Special SitePR
あなたにおすすめの記事PR