FE EXAM

コミット(COMMIT)

トランザクションの処理結果を確定してデータベースに反映する操作。

INTERACTIVE VISUALIZATION
作業中の暫定値
確定済み
フェーズ
idle
トランザクション
未開始
確定状態
未確定
シナリオ
ステップ1 / 6
STEP 1/6処理を始める前A口座に5000円、B口座に2000円が入っています。これからAからBへ1000円を振り込みます。振込は「Aから引く」と「Bへ足す」の2つの更新がセットになった、ひとまとまりの処理です。このひとまとまりを「トランザクション」と呼びます。
TRANSACTION未開始
-- まだ何もしていない
A口座
確定済み
5,000
作業中
5,000
B口座
確定済み
2,000
作業中
2,000
解説

📌
コミットとは

作業中(下書き)A:4000 B:3000COMMIT確定(DB本体)A:4000 B:3000

コミット(COMMIT)とは、トランザクションの処理結果を確定して、データベースに正式に反映する操作のことです。トランザクションとは「ひとまとまりにして扱うべき複数の処理」のことで、コミットはその仕上げの宣言にあたります。

身近な例で考えると、書類に鉛筆で下書きしてから、ペンで清書(清書=消せない正式な記録にすること)するのに似ています。下書き(作業中の暫定値)の段階ではまだ直せますが、清書(コミット)してしまうと、その内容が正式な記録として確定し、もう取り消せません。

上のツールで▶ボタンを押すと、銀行振込の2つの更新が作業中の暫定値として進み、COMMITでデータベース本体へまとめて反映され、確定する流れを確認できます。

🔒
確定の仕組み

BEGINUPDATEUPDATECOMMITCOMMIT で暫定値をまとめて確定

コミットの内部では、トランザクション中の更新がどう扱われているのかを見てみましょう。流れは次のとおりです。


BEGIN(開始):トランザクションが始まり、以降の更新は作業用の一時領域(暫定値)で進む
UPDATE(更新):暫定値だけが変わり、データベース本体の確定済みの値はまだ動かない
COMMIT(確定):暫定値をデータベース本体へ「まとめて」書き込み、変更ログにも記録して確定する

重要なのは、コミット済みの内容は障害が起きても失われないという保証です。これを「耐久性(じきゅうせい)」と呼びます。上のツールのSTEP3〜5で、暫定値(作業中)だけが先に変わり、COMMITで確定済みの値がまとめて更新される様子を確認できます。

⚖️
ロールバックとの関係

処理中COMMIT=確定ROLLBACK=取消

コミットには対になる操作があります。それがロールバック(ROLLBACK)です。トランザクションを終えるとき、結果を残すならコミット、なかったことにするならロールバックを選びます。

項目コミットロールバック
結果変更を確定して反映変更を取り消して元に戻す
使う場面処理が全部成功したとき途中で失敗・障害が起きたとき
その後取り消せない開始前の状態に戻る

この2つがあることで、トランザクションは「全部成功してコミット」か「全部なかったことにしてロールバック」のどちらかになり、中途半端な状態が残りません。この性質を「原子性(げんしせい)」と呼びます。コミットは成功時の締めくくり、ロールバックは失敗時の取り消し、と覚えてください。

📌
なぜトランザクションが必要なのか

「全部成功」か「全部なし」のどちらかに決まる処理開始全部成功COMMIT→ 全変更が反映処理開始途中で失敗ROLLBACK→ 全変更が取り消し

トランザクション(=まとめて扱う一連の処理)が必要な理由は、「複数の更新のうち一部だけが反映されてしまう」という問題を防ぐためです。

銀行振込を例に考えます。「A口座から1000円引く」「B口座に1000円足す」という2つの更新が1セットです。もし途中で障害が起きて「引く」だけ実行されたら、お金が消えてしまいます。トランザクションはこの2つを1つのまとまりとして扱い、次の約束を守ります。
全部成功したらCOMMIT(全変更をデータベースに反映)
途中で失敗したらROLLBACK(全変更をなかったことにして元に戻す)

この「全部か無か」の性質を原子性(げんしせい)と呼びます。原子(=これ以上分割できない最小単位)のように、トランザクションも「バラバラにされない1つのかたまり」として扱われます。上のツールで▶ボタンを押すと、2つの更新がまとめてCOMMITされる流れが確認できます。

📌
コミットが実際に使われる場面

銀行振込A -1000B +1000COMMITネット購注在庫-1注文登録COMMIT会員登録情報登録ポイント付与COMMITどのケースも最後に COMMIT でまとめて確定する

コミットは、複数の更新が「セットで成立する」あらゆる場面で使われます。具体的な例を見てみましょう。
銀行振込:A口座の減額とB口座の増額を1つのトランザクションにし、両方成功したらCOMMIT
ネットショッピングの注文:在庫を1つ減らす処理と注文データを登録する処理をセットにし、両方成功したらCOMMIT
会員登録:ユーザー情報の登録とポイント付与をセットにし、両方成功したらCOMMIT

どのケースでも共通するのは「バラバラに起きたら困る更新を1つのトランザクションにまとめ、全部成功したらCOMMITで確定する」という考え方です。もし途中で失敗したときはROLLBACKで全更新を取り消し、中途半端な状態にならないように保護します。

身近な例で考えると、レジで商品をまとめて精算するのに似ています。商品を1点ずつバラバラに会計するのではなく、全部をまとめてから「決済(COMMIT)」ボタンを押すことで、一部だけ引き落とされるという事故を防ぎます。上のツールのSTEP5でこの「まとめて確定」の動きを確認してみましょう。

練習問題

🎯
基本情報技術者 練習問題

Q1.コミット(COMMIT)の説明として最も適切なものはどれか。
A.トランザクションの処理結果を確定してデータベースに反映する操作
B.トランザクションの処理を取り消して開始前に戻す操作
C.トランザクションを開始する操作
D.複数のトランザクションを直列に並べる操作
Q2.コミット前のトランザクションについて正しいものはどれか。
A.すでにデータベース本体に反映されており取り消せない
B.作業中の暫定値であり、まだ取り消すことができる
C.ほかの利用者からも更新後の値がすぐ見える
D.障害が起きても必ず保存される
Q3.2つの更新を含むトランザクションをコミットしたとき正しいものはどれか。
A.1つ目の更新だけが反映される
B.2つの更新が別々のタイミングで反映される
C.2つの更新がまとめて反映される
D.どちらの更新も反映されない

関連コンテンツ