銀行の振込で「引き落としだけ済んで、入金されなかった」が起きないのは、データベースが一連の更新をトランザクションという単位で、全部やるか、何もしないかのどちらかにしているからです。
トランザクション ── コミットとロールバック
トランザクションは、データベースに対する、切り離してはいけない一連の処理のまとまりです。 A口座からB口座へ1万円を振り込むなら、「Aから1万円を引く」と「Bに1万円を足す」の2つで1つのトランザクションです。 片方だけ実行されると、1万円が消えたり、増えたりします。
2つの処理がそろって成功したときだけ確定し、途中で失敗したら最初に戻します。
コミット … トランザクションが正常に終わったときに、データベースへの更新を確定させること
ロールバック … トランザクションが途中で失敗したときに、データベースをトランザクション開始前の状態に戻すこと
コミットするまでの更新は、まだ仮のものです。途中で失敗すれば、ロールバックで仮の更新をすべて取り消します。 一連の処理がすべて成功したらコミットで確定し、途中で失敗したらロールバックで処理前に戻す。これがトランザクション処理です。
トランザクションに求められる性質は、4つの英語の頭文字をとってACID特性と呼ばれます。
ACID特性
原子性(Atomicity) … 一連の処理が全て実行されるか、全く実行されないかのどちらか。途中までの状態を残さない
一貫性(Consistency) … 処理の前後で、データが決まりに合った矛盾のない状態を保つ。例:振込の前後で2つの口座の残高の合計は変わらない
独立性(Isolation) … 同時に動いているほかのトランザクションの、途中の状態に影響されない
耐久性(Durability) … コミットした結果は、そのあと障害が起きても失われない
原子性を守る道具がコミットとロールバック、独立性を守る道具が次の節の排他制御、耐久性を守る道具が最後の節のログとバックアップです。
1つのトランザクションが複数のデータベース(別々のサーバ)にまたがることもあります。 このとき、片方のサーバだけがコミットすると原子性が崩れます。そこで2相コミットメントでは、 まず全部のサーバに「コミットできる状態か」を確かめ(1段目)、全部がよければ全部でコミットし、 1つでも駄目なら全部でロールバックします(2段目)。
次のものはデータベースの別の機能で、トランザクション処理やACID特性の説明ではありません。 索引(インデックス)を用意して検索を速くすること、データベースの複製を別のサーバに置いて同期をとり、 止まりにくくすること(可用性を高める)、表を正規化して重複や矛盾を防ぐこと、 複数の表を関係づける列で結合して1つの表にすること。 また、データベースに対して行った操作を順に記録するのはログの働きで、トランザクションそのものではありません。
同時実行制御(排他制御)とロック
データベースは、多くの利用者が同時に使います。ネットショップで在庫が10個の商品を、AさんとBさんがほぼ同時に1個ずつ買ったとします。 2人の処理がどちらも「在庫10個」を読み、それぞれ「10−1=9個」を書き込むと、2個売れたのに在庫は9個になります。 あとから書いた更新が、先の更新を上書きして消してしまうのです。
ロックをかけると、あとの人は前の人の更新が終わるまで待つので、更新が消えません。
これを防ぐのが同時実行制御(排他制御)です。 あるトランザクションが更新しているデータには、ほかのトランザクションが同時に更新できないようにする。これが排他制御です。 その代表的な手段がロックで、データに「使用中」の印をつけ、ほかのトランザクションを待たせます。 Aさんの処理が読む前にロックをかけ、10個を読んで9個に更新してからロックを外します。待っていたBさんの処理はそのあとでロックをかけ、9個を読んで8個に更新します。これなら数は合います。
ロックの種類
共有ロック … データを読むときにかける。ほかのトランザクションも読めるが、書き換えはできない
専有ロック … データを更新するときにかける。ほかのトランザクションは、読むことも書くこともできない
ロックをかける範囲を、表全体ではなく1行ずつのように小さくするほど、別のデータを扱う処理どうしは待たずに進められます。 排他制御は、ACID特性のうちの独立性を守る仕組みです。
ある劇場の予約システムで、残り1席の公演に2人がほぼ同時に申し込み、2人とも予約が成立してしまいました。 この不具合を防ぐ仕組みとして、最も適切なのはどれですか。
× バックアップは、障害のあとにデータを戻すための備えです。同時に申し込んだ2人の処理がぶつかることは防げません。
× 正規化は表の設計の話です。表をどう分けても、2つの処理が同じ席の空き状況を同時に読んで書けば、同じことが起きます。
× ロールフォワードは、障害で失われた更新をログからやり直す回復の手順です。同時の更新を止める働きはありません。
○ 正解 1人目の処理が席の空きを確かめてから予約を書き込むまでの間、ほかの処理がその席のデータを読むことも更新することもできないようにロックをかけるです。
排他制御です。2人目の処理は1人目の更新が終わるまで待ち、そのあとで「満席」を読むので、2つ目の予約は成立しません。
デッドロック
ロックには副作用があります。トランザクション1がデータXをロックし、トランザクション2がデータYをロックしたとします。 続けて、トランザクション1がYを、トランザクション2がXを使おうとすると、どちらも相手のロックが外れるのを待つことになります。
どちらも相手が持っているロックを待つので、どちらも先へ進めません。
2つ以上のトランザクションが、互いに相手の持っているロックが外れるのを待ち続けて、どれも先へ進めなくなる状態をデッドロックといいます。 待っているだけでは、いつまでも解けません。多くのDBMS(データベース管理システム)は、デッドロックを見つけると、 関わっているトランザクションのどれか1つをロールバックしてロックを外させ、残りを先に進めます。
起こりにくくする工夫としては、どのトランザクションも同じ順番でロックをかける(例:必ずX、Yの順)ことが知られています。 全員が同じ順に取りに行けば、「互いに相手の分を持ったまま待つ」形になりません。
障害からの回復 ── ログ・バックアップ・ロールフォワード
ACID特性の耐久性、つまりコミットした結果を障害のあとまで残すために、DBMSは2つのものを用意します。
ログ(ジャーナル) … データベースの更新の履歴を記録したファイル。どのトランザクションが、どのデータを、何から(更新前の値)何に(更新後の値)変えたかを書き残す
バックアップ … ある時点のデータベースの内容を、丸ごと別の媒体に写したもの
回復の手順は、障害の種類で2つに分かれます。
トランザクションが途中で失敗したときは、ログの更新前の値を使って、そのトランザクションの更新を取り消します。 これがロールバックで、回復の手順としてはバックワードリカバリとも呼ばれます(時間を後ろへ戻す回復)。
データベースのディスクが壊れたときは、まずバックアップを戻します。 ただし、それだけではバックアップを取った時点の内容にしか戻らず、そのあとにコミットした更新は失われたままです。 そこで、ログの更新後の値を使って、バックアップ以降にコミットされた更新を順にやり直します。 これがロールフォワード(フォワードリカバリ、時間を前へ進める回復)です。 バックアップを戻し、ログでその後の更新をやり直せば、障害の直前の状態まで戻せます。 そのためログは、データベースとは別のディスクに置きます。
バックアップだけでは取った時点までしか戻らないので、そのあとの更新をログでやり直します。
DBMSは、更新をいったんメモリ上に置き、ときどきまとめてディスクに書き出します。 この書き出しを行う時点をチェックポイントといいます。チェックポイントまでの更新はディスクに入っているので、 電源が落ちるなどしてメモリの内容が消えたときも、チェックポイントより前にコミットを終えたトランザクションには手を付けずに済みます。 回復するのは、チェックポイントの時点でまだ終わっていなかったものと、そのあとに始まったものだけです。 そのうちコミット済みの更新はログの更新後の値でやり直し、コミットしていない更新はログの更新前の値で取り消します。
ある会社では、データベースのバックアップを毎晩0時に取り、ログはデータベースとは別のディスクに記録しています。 ある日の15時に、データベースのディスクが故障しました。故障の直前の状態まで戻すための手順として、最も適切なのはどれですか。
○ 正解 0時のバックアップを戻し、ログを使ってその後にコミットされた更新をやり直すです。
ロールフォワードです。バックアップで0時の状態に戻し、0時から故障までにコミットされた更新を、ログの更新後の値で前へ進めて取り戻します。
× 0時の状態にしか戻りません。0時から15時までにコミットした更新は失われたままです。
× ロールバックの手順です。失敗したトランザクションを取り消すときに使うもので、壊れたディスクの中身を取り戻すことはできません。
× ロックは同時の更新を防ぐ排他制御の手段で、失われたデータを戻す働きはありません。
まとめ
この回で持ち帰ること
1. トランザクション=切り離せない一連の処理のまとまり。全部成功したらコミット(更新を確定)、途中で失敗したらロールバック(開始前の状態に戻す)
2. ACID特性=原子性(全部か無か)・一貫性(矛盾のない状態を保つ)・独立性(ほかの途中の状態に影響されない)・耐久性(コミットした結果は消えない)
3. 排他制御=同じデータを同時に更新させない仕組み。手段はロック(共有ロック=読むとき、専有ロック=更新するとき)
4. デッドロック=互いに相手のロックを待ち続けて止まる状態。多くのDBMSはどれか1つをロールバックして解く。同じ順番でロックをかけると起こりにくい
5. ログ=更新の履歴を記録したファイル。失敗したら更新前の値でロールバック、ディスクが壊れたらバックアップを戻して更新後の値でロールフォワード
6. 索引・複製の分散配置・正規化・表の結合は、トランザクション処理とは別の機能
この節で解ける公開問題
令和4〜8年度の公開問題のうち、この節の知識で解ける問題は次の5問です。
トランザクション処理
令和4年度 問77ACID特性(原子性)令和5年度 問66コミット令和6年度 問74コミット・排他制御・ロールバック・ログ令和7年度 問61DBMSのトランザクション令和8年度 問56DBMSのチェックポイント
教科書の一覧(現行の試験の順)教科書の一覧(新しい試験の順)過去問
Udemy の ITパスポート講座を、受講者数・★評価・口コミで比べたページです(広告を含みます)。
出典:IPA「ITパスポート試験 シラバス(案)Ver0.1」(2026年8月31日)、「ITパスポート試験 シラバス Ver6.5」、 「基本情報技術者試験 シラバス Ver9.2」(トランザクション処理)。 図と本文の例(振込・在庫・劇場の予約)は当サイトが説明のために作ったもので、練習問題も当サイトのオリジナルです。

