【Day32】トランザクション処理と排他制御

投稿者: | 2025年9月9日

こんにちは!今日は トランザクション処理、排他制御、デッドロック、2相コミットメント について、基本情報技術者試験の過去問を交えながら解説します。

1️⃣ トランザクション処理とは?

トランザクションとは、データベースの一連の処理をまとめたものです。
たとえば「銀行の振込」なら、

  1. Aさんの口座から1万円引き落とす
  2. Bさんの口座に1万円入金する

この2つは「セット」で成功しなければいけません。片方だけ失敗したら大変ですよね。


💡 ACID特性

トランザクションが守るべき4つの性質です。

  • Atomicity(原子性):全部やるか、全部やらないか
  • Consistency(一貫性):ルールを壊さない
  • Isolation(独立性):同時に動いても干渉しない
  • Durability(永続性):一度終わったら失われない

2️⃣ 排他制御とは?

複数の人が同じデータを同時に操作すると、データが壊れる可能性があります。
これを防ぐ仕組みが 排他制御(ロック) です。

  • 共有ロック(Sロック):読み取り専用。複数人が同時に見れる。
  • 排他ロック(Xロック):書き込み用。1人だけが使える。

👉 たとえ:
「みんなで絵本を読むときは一緒に見れる(共有ロック)」
「絵本に落書きするときは1人しかできない(排他ロック)」


3️⃣ デッドロックとは?

排他制御のときに発生する問題です。

例:

  • Aくんが「ブロック」を持ちながら「絵本」を欲しがる
  • Bくんが「絵本」を持ちながら「ブロック」を欲しがる

👉 どちらも待ち続けて進めなくなる状態 → これが デッドロック

回避方法:

  • 順序を決めてロックを取る
  • タイムアウトを設定して諦める

4️⃣ 2相コミットメントとは?

分散データベース(複数のサーバにまたがるトランザクション)で使う仕組みです。

  1. 準備(prepare)フェーズ:各サーバに「大丈夫?準備できる?」と確認
  2. コミット(commit)フェーズ:全員OKなら「実行!」、誰かNGなら「やめ!」

👉 たとえ:
「みんなで一緒におやつを食べる」場面で、
先生が「準備できた?」と確認して、全員が「はい!」と言ったら「いただきます!」をするイメージです。


5️⃣ 過去問例

問題1(H30春 FE 午後)

データベースにおける排他制御に関する説明として、適切なものはどれか。

  1. トランザクションの原子性を保証する。
  2. データの一貫性を保証する。
  3. データの独立性を保証する。
  4. データの永続性を保証する。

➡️ 正解:3(排他制御は同時実行の独立性を守る)


問題2(R1秋 FE 午前)

分散データベースにおいて、2相コミットメントの目的はどれか。

  1. デッドロックを回避する
  2. データの更新を一貫して行う
  3. 排他制御の効率を高める
  4. 更新処理を高速化する

➡️ 正解:2


まとめ

2相コミットメントは「分散DBでもみんな一斉にコミット!」の仕組み

トランザクションは「ACID特性」を守る

排他制御でデータの整合性を保つ

デッドロックは「待ち続けて止まる」問題

つぎに「DBMS」について解説します。


✅ DBMSとは?

**DBMS(Database Management System:データベース管理システム)**とは、
データベースを効率よく、正しく、安全に扱うためのソフトウェアのことです。

たとえば…

  • Oracle Database
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server

などが有名なDBMSです。


✅ DBMSの役割

  1. データの格納と管理
     表(テーブル)という形でデータを整理して保存する。
  2. 問い合わせ処理(SQL)
     「この条件に合うデータを出して!」とSQLでリクエストすると、DBMSが探して返してくれる。
  3. トランザクション管理
     ACID特性(原子性・一貫性・独立性・永続性)を守る。
  4. 排他制御
     同時に複数ユーザーが使っても、データが壊れないようにする。
  5. 障害回復
     停電やエラーがあっても、ログなどを使って復旧できる。
  6. セキュリティ管理
     ユーザーごとのアクセス権限(参照・更新できるかどうか)を設定できる。

✅ 幼稚園的なたとえ

データベースを「おもちゃ箱」と考えると…

  • おもちゃを「どこにしまうか」を決める先生(整理整頓)
  • 子どもたちが「これ貸して!」と言ったら探して渡してくれる先生(検索)
  • みんなで遊ぶときにケンカしないようにルールを守らせる先生(排他制御)
  • 落としたおもちゃを元に戻す先生(障害回復)

👉 この「おもちゃ管理の先生」が DBMS です。


✅ 過去問(基本情報技術者)

問題
DBMSの機能の説明として、適切なものはどれか。

  1. データを物理的な記憶装置に直接書き込む機能をアプリケーションに提供する。
  2. データの整合性を保ちながら複数利用者が同時にアクセスできるようにする。
  3. コンパイラが出力したオブジェクトプログラムを最適化する。
  4. アプリケーションプログラムの実行に必要なメモリ割当てを行う。

➡️ 正解:2


ではでは、つぎに、「アボート処理」について整理してみましょう。


✅ アボート処理とは?

アボート(Abort)処理とは、
トランザクションが途中でエラーや問題によって「正常に続行できなくなったときに、途中までの処理を取り消して元の状態に戻すこと」です。


✅ どんなときにアボートするの?

  • システム障害(停電、ハード故障)
  • プログラムエラー(例:ゼロ除算など)
  • 排他制御でデッドロックが発生したとき
  • 利用者が「キャンセル」したとき

👉 つまり、「全部やるか、全部やらないか」の「やらない」側が アボート です。


✅ 幼稚園的なたとえ

砂場で「お山を作る」遊びをしているとき…

  • バケツで砂を半分入れたけど、誰かが水をこぼして砂がぐちゃぐちゃになった。
  • そのまま続けてもキレイにできないから、いったん全部崩して最初からやり直す。

👉 これが アボート処理


✅ 関連するキーワード

  • コミット(Commit):トランザクションが成功して「確定」する。
  • アボート(Abort):トランザクションが失敗して「取り消し」になる。

(試験では「コミットとアボートの違い」を問うパターンが多いです)


✅ 過去問例(基本情報技術者・午前)

問題
データベースのトランザクション処理において「アボート(Abort)」の説明として、最も適切なものはどれか。

  1. トランザクションの更新結果をデータベースに反映する。
  2. トランザクションを途中で打ち切り、更新結果を取り消す。
  3. トランザクションを同時に複数実行できるようにする。
  4. トランザクションの実行結果をログに保存する。

➡️ 正解:2


「アボート処理」に関係する ロールバックログ(REDO/UNDO) について整理してみましょう。


🔹 アボート処理とロールバック・ログの関係

✅ ロールバック(Rollback)

  • アボートするときに 途中の処理を取り消して、データベースを元の状態に戻す操作
  • 「やっぱりなかったことにする!」というイメージ。
  • ロールバックを行うために必要なのが ログファイル

✅ ログ(ジャーナルファイルとも呼ばれる)

DBMS はトランザクションの処理を記録するために ログファイル を使います。

  • REDOログ(再実行ログ)
    → 途中でシステムが落ちても、処理をやり直して元に戻す。
    例:電気が落ちたときに、やりかけの砂山をもう一度作れるように記録しておく。
  • UNDOログ(取り消しログ)
    → 途中でキャンセル(アボート)した場合に、処理前の状態に戻せるようにする。
    例:砂をバケツに入れる前の「空の状態」を覚えておいて、途中で崩すときに戻せるようにする。

✅ 幼稚園的なたとえ

  • お絵かきをしているときに「間違えた!」となったら消しゴムで消す(=UNDOログでロールバック)。
  • 「上手に描けた!」と思ったら作品をスキャンして保存しておく(=REDOログでリカバリ可能)。

✅ 試験に出るポイント

  1. ロールバックはアボート時に使う
  2. REDOとUNDOの違い
  3. ログをもとに障害から回復できる

✅ 過去問例(基本情報技術者・午前)

問題
データベースのトランザクション処理で、システム障害が発生したときに、トランザクションの更新結果を取り消す操作を何というか。

  1. チェックポイント
  2. ロールバック
  3. リカバリ
  4. コミット

➡️ 正解:2(ロールバック)


問題
データベースの障害回復処理で用いられる REDO ログと UNDO ログの説明として、適切なものはどれか。

  1. REDO ログはトランザクションの取り消しに用いられる。
  2. REDO ログは障害発生前の更新を再実行するために用いられる。
  3. UNDO ログは障害発生前の更新を再実行するために用いられる。
  4. UNDO ログはトランザクションの確定処理に用いられる。

➡️ 正解:2


🚑 DBの安全装置


ここまで、「トランザクション」「ロールバック」「ログ」などを学んできましたが、つぎはその先の 障害回復(リカバリ処理) に踏み込みます。


🔹 データベースに起こる障害の種類

データベースは「ずっと正しい状態」を守るのが使命。
でも実際にはこんなトラブルが起こります👇

  1. トランザクション障害
    • 入力ミス、アプリのエラー、ユーザーが強制終了 → 途中で止まっちゃう。
  2. システム障害
    • 停電、OSクラッシュ、メモリ異常 → みんなまとめてダウン。
  3. 媒体障害(ディスク障害)
    • HDDやSSDが壊れる → データが消える。

🔹 障害からの回復方法(リカバリ)

障害が起こったら、DBMS は ログファイル を使って「直前の正しい状態」に戻します。

✅ 代表的な方法

  • ロールバック(Rollback)
    → アボート時など、未完了トランザクションを「なかったことにする」。
  • ロールフォワード(Rollforward, REDO)
    → 障害発生直前までの処理を やり直す
    (チェックポイントからログをたどって再実行)
  • チェックポイント処理
    → 一定間隔で「ここまで正しい」と印をつける。
    → 障害が起きたら、そこから復旧すればよい。

🔹 試験によく出る過去問

過去問①

問題
データベースの障害回復処理において、障害発生前に完了していたトランザクションの更新を再度反映する処理はどれか。

  1. ロールバック
  2. ロールフォワード
  3. チェックポイント
  4. アボート

➡️ 正解:2(ロールフォワード)


過去問②

問題
データベースのチェックポイント処理の目的はどれか。

  1. 更新結果を確実にディスクに書き込む
  2. トランザクションの同時実行を制御する
  3. 障害発生時の回復処理を効率化する
  4. デッドロックを検出する

➡️ 正解:3


🔹 まとめ

  • 障害の種類 → トランザクション障害・システム障害・媒体障害
  • 回復方法 → ロールバック(UNDO)・ロールフォワード(REDO)・チェックポイント
  • 試験ポイント → 「ロールバックは取消」「ロールフォワードは再実行」