はじめに
基本情報技術者試験の過去問(令和3年 問28、原子性の問題)を解きながら、トランザクション・ACID・DBMSといった概念を整理した。
最初は用語がバラバラに見えていたが、「DBMSがトランザクションのACIDを保証する」 という一本の筋でつながった。その流れをまとめる。
DBMSとデータベースは別物
まず混同しやすい二つを分けておく。
データベース(DB) … データを整理して集めたもの「そのもの」。(例:馬名・レース記録・会員情報の表の集まり)
DBMS(Database Management System) … そのデータベースを管理する「ソフトウェア」。データの保存・検索・更新・削除を行い、複数の要求を整理し、ACIDなどの規則を守る。
MySQL、PostgreSQL、Oracle などが DBMS にあたる。
今回の過去問が「DBMSに実装すべき原子性」と問うのは、原子性を実際に保証する責任者がDBMSだからである。DBは「管理されるデータ」、DBMSは「管理するプログラム」だ。
トランザクションとは
複数の作業を一つにまとめた「ひとかたまりの単位」である。
例えば馬券を1枚買うとき、内部では二つの作業が起きる。
① 残高から購入額を引く
② 馬券を1枚発行する
この二つは切り離してはいけない。こうした「必ず一緒に処理すべき作業の束」をまとめたものがトランザクションだ。
ACID ― トランザクションが守るべき4つの約束
原子性(Atomicity) … 全て実行されるか、全て取り消されるか
一貫性(Consistency) … 規則に合った正しい状態だけを保つ
独立性(Isolation) … 他のトランザクションに邪魔されない
持続性(Durability) … 完了したものは障害が起きても消えない
今回の問題は、この中の 原子性 を問うている。
原子性(Atomicity)を深掘りする
atom は「これ以上分けられないもの」。トランザクションを分けられない一つの塊として扱う、という意味だ。
全て成功すれば全て反映(COMMIT)、一つでも失敗すれば全て取り消し(ROLLBACK)。「中間状態」は存在しない。
馬券購入でいえば、①残高だけ引かれて②発行が失敗すると、「お金は減ったのに馬券がない」という幽霊のような状態になる。
原子性はこれを禁止し、①まで無かったことにして残高を元に戻す。
ここで大事な気づきがある。原子性の本質は「成功の保証」ではなく「失敗したときの巻き戻し」にある。
成功は原子性がなくても起きる。失敗時にきれいに戻せることこそ、原子性が存在する理由だ。
だから原子性を確認したいときは、こう問えばよい。
「失敗したらどうなるか?」 ― 元に戻れば原子性あり、中途半端に残れば原子性が壊れている。
過去問で確認
問題は「原子性を説明したものはどれか」。他の選択肢は、ACIDの別の性質を説明した引っかけになっている。
「完了後に障害が起きても更新内容が保証される」→ 持続性(Durability)
「全て実行されるか、全て取り消されるか」→ 原子性(Atomicity)=正解
「他のトランザクションの影響を受けない」→ 独立性(Isolation)
「同じ処理を何度実行しても結果が同じ」→ ACIDのどれでもない引っかけ
持続性(障害後も保証)や独立性(互いに干渉しない)と混同しないことが、この問題の要だった。
まとめ
DBは「データそのもの」、DBMSは「それを管理し、ACIDを保証するソフトウェア」。
トランザクションは「必ず一緒に処理すべき作業の束」。
原子性=全て実行 or 全て取り消し。本質は「失敗時のロールバック」。
確認法:迷ったら「失敗したらどうなるか?」を問う。