シカラボ

なぜ振込の残高が食い違わないのか|トランザクションとロールバック【ITパスポート】

シカラボ編集部
なぜ振込の残高が食い違わないのか|トランザクションとロールバック【ITパスポート】

口座Aから1万円を引いて、口座Bに1万円を足す。この2つのあいだで機械が止まったら、お金はどこへ行くのでしょうか。止まること自体は起こりえます。それでも「引かれたのに入っていない」という中途半端な結果は残りません。両方やるか、どちらもやらないかを保証する仕組みが働くからです。それがトランザクションです。

トランザクションとは

トランザクションとは、一連の処理をひとまとまりとして扱い、全て成功したら確定し、途中で失敗したら元に戻す仕組みのことです。

データベースに対する一連の処理が全て成功したら変更結果を確定し、途中で失敗したら処理前の状態に戻す。

(出典:ITパスポート試験 令和7年 問61)

大事なのは「一連の処理」をひとかたまりに数える点です。振込なら「引く」と「足す」で2つの操作ですが、トランザクションとしては1件です。以下では、振込をデータベース上の例として単純化して説明します。

この「全部やるか、まったくやらないか」という性質には名前がついています。

データの更新時に、一連の処理が全て実行されるか、全く実行されないように制御することによって、原子性を保証することができる。

(出典:ITパスポート試験 令和4年 問77)

これ以上分けられない、という意味で原子性と呼びます。この問題はACID特性を扱っていて、原子性はその1つです。ほかの3つはこの問題では説明されていないので、まずは原子性から押さえておきましょう。シラバス上は、デッドロックや2相コミットメントも同じ「トランザクション処理」に並びますが、この記事ではコミットとロールバックを中心に扱います。

具体例でイメージをつかむ

先ほどの振込を、機械の側から追ってみましょう。

処理は「口座Aから1万円引く」「口座Bに1万円足す」の2つ。両方が終わったところで、はじめて結果を確定させます。この確定の操作がコミットです。

反対に、2つ目の途中で異常が起きたとします。このときデータベースは、トランザクションを始める前の状態まで巻き戻します。これがロールバックです。口座Aの残高も元どおりになるので、「引かれたのに入っていない」は起きません。

振込の2つの処理が両方成功したらコミットで確定し、途中で失敗したらロールバックで開始前に戻ることを示した図

たとえば平成27年秋期の問71は、4つのトランザクションを順に実行して、途中で異常終了したものを特定させる問題です。ロールバックで何が消えて何が残るかを追えるかが問われます。巻き戻る範囲は「そのトランザクションの中だけ」で、すでにコミットされたものには手が付きません。ここを取り違えると解けなくなります。

コミットとロールバックの使い分け

2つは正反対の操作です。どちらが起きるかは、処理が成功したかどうかで決まります。表で並べておきましょう。

いつ起きるか何をするか
コミット一連の処理が正常に終わったときデータベースへの更新を確定させる
ロールバック途中で正常に処理されなかったときトランザクション開始前の状態に戻す
コミット・ロールバック・排他制御・ログの4つの仕組みを、それぞれの役割と対応させて並べた図

覚え方は「うまくいったらコミット、だめならロールバック」です。カタカナが2つ並ぶと混ざりますが、ロールバック(roll back)は「巻き戻す」という語なので、そこから引くと迷いません。

まわりの仕組みも1つずつ役割が違います。排他制御は、複数のプログラムが同じデータを同時に触ったときにデータの不整合が起きないようにするものです(令和元年秋期 問64)。ログは、データベースの更新履歴を記録したファイルを指します(令和6年 問74)。障害から復旧するときに使われます。

試験ではこう出る

よく出るのは次の2つです。コミットやロールバックの説明を選ばせる形と、処理の流れを追わせる形です。まずは説明からどうぞ。

腕試し問題

出典:ITパスポート試験 令和5年度 問66

トランザクション処理におけるコミットの説明として、適切なものはどれか。

解答と解説

解説(解答せずに開けます)

正解はイです。

コミットは、トランザクションが正常に処理されたときに更新を確定させる操作です。「正常に」「確定」の2語がそろっているものを選びます。

もう1問、反対側のロールバックも解いてみましょう。

腕試し問題

出典:ITパスポート試験 平成30年秋期 問63

トランザクション処理におけるロールバックの説明として、適切なものはどれか。

解答と解説

解説(解答せずに開けます)

正解はウです。ロールバックは、正常に処理されなかったときにデータベースをトランザクション開始前の状態に戻します。「直前の状態」ではなく「開始前の状態」である点が要です。この問題でいうトランザクション全体のロールバックでは、2つの操作のうち1つだけを取り消す形にはなりません。

まとめ

  • トランザクションは、一連の処理をひとまとまりとして扱う仕組み。全部やるか、まったくやらないか
  • この性質を原子性という。ACID特性の1つ
  • コミットは正常終了で更新を確定、ロールバックは異常終了で開始前に戻す
  • 巻き戻るのはそのトランザクションの中だけ。コミット済みのものには手が付かない
  • 排他制御は同時アクセスによる不整合を防ぐ仕組み、ログは更新履歴のファイル。どちらもトランザクション処理の中の機能だが、コミット・ロールバックとは役割が違う

振込の例を1つ持っておくと、どの用語が出てきても位置づけを思い出せます。処理の流れを追う問題が出たら、まず「どこまでコミットされたか」を確かめてみてください。

この記事のタグ

関連記事