トランザクションの処理結果を確定してデータベースに反映する操作。
コミット(COMMIT)とは、トランザクションの処理結果を確定して、データベースに正式に反映する操作のことです。トランザクションとは「ひとまとまりにして扱うべき複数の処理」のことで、コミットはその仕上げの宣言にあたります。
身近な例で考えると、書類に鉛筆で下書きしてから、ペンで清書(清書=消せない正式な記録にすること)するのに似ています。下書き(作業中の暫定値)の段階ではまだ直せますが、清書(コミット)してしまうと、その内容が正式な記録として確定し、もう取り消せません。
上のツールで▶ボタンを押すと、銀行振込の2つの更新が作業中の暫定値として進み、COMMITでデータベース本体へまとめて反映され、確定する流れを確認できます。
コミットの内部では、トランザクション中の更新がどう扱われているのかを見てみましょう。流れは次のとおりです。
・BEGIN(開始):トランザクションが始まり、以降の更新は作業用の一時領域(暫定値)で進む
・UPDATE(更新):暫定値だけが変わり、データベース本体の確定済みの値はまだ動かない
・COMMIT(確定):暫定値をデータベース本体へ「まとめて」書き込み、変更ログにも記録して確定する
重要なのは、コミット済みの内容は障害が起きても失われないという保証です。これを「耐久性(じきゅうせい)」と呼びます。上のツールのSTEP3〜5で、暫定値(作業中)だけが先に変わり、COMMITで確定済みの値がまとめて更新される様子を確認できます。
コミットには対になる操作があります。それがロールバック(ROLLBACK)です。トランザクションを終えるとき、結果を残すならコミット、なかったことにするならロールバックを選びます。
| 項目 | コミット | ロールバック |
|---|---|---|
| 結果 | 変更を確定して反映 | 変更を取り消して元に戻す |
| 使う場面 | 処理が全部成功したとき | 途中で失敗・障害が起きたとき |
| その後 | 取り消せない | 開始前の状態に戻る |
この2つがあることで、トランザクションは「全部成功してコミット」か「全部なかったことにしてロールバック」のどちらかになり、中途半端な状態が残りません。この性質を「原子性(げんしせい)」と呼びます。コミットは成功時の締めくくり、ロールバックは失敗時の取り消し、と覚えてください。
トランザクション(=まとめて扱う一連の処理)が必要な理由は、「複数の更新のうち一部だけが反映されてしまう」という問題を防ぐためです。
銀行振込を例に考えます。「A口座から1000円引く」「B口座に1000円足す」という2つの更新が1セットです。もし途中で障害が起きて「引く」だけ実行されたら、お金が消えてしまいます。トランザクションはこの2つを1つのまとまりとして扱い、次の約束を守ります。
・全部成功したらCOMMIT(全変更をデータベースに反映)
・途中で失敗したらROLLBACK(全変更をなかったことにして元に戻す)
この「全部か無か」の性質を原子性(げんしせい)と呼びます。原子(=これ以上分割できない最小単位)のように、トランザクションも「バラバラにされない1つのかたまり」として扱われます。上のツールで▶ボタンを押すと、2つの更新がまとめてCOMMITされる流れが確認できます。
コミットは、複数の更新が「セットで成立する」あらゆる場面で使われます。具体的な例を見てみましょう。
・銀行振込:A口座の減額とB口座の増額を1つのトランザクションにし、両方成功したらCOMMIT
・ネットショッピングの注文:在庫を1つ減らす処理と注文データを登録する処理をセットにし、両方成功したらCOMMIT
・会員登録:ユーザー情報の登録とポイント付与をセットにし、両方成功したらCOMMIT
どのケースでも共通するのは「バラバラに起きたら困る更新を1つのトランザクションにまとめ、全部成功したらCOMMITで確定する」という考え方です。もし途中で失敗したときはROLLBACKで全更新を取り消し、中途半端な状態にならないように保護します。
身近な例で考えると、レジで商品をまとめて精算するのに似ています。商品を1点ずつバラバラに会計するのではなく、全部をまとめてから「決済(COMMIT)」ボタンを押すことで、一部だけ引き落とされるという事故を防ぎます。上のツールのSTEP5でこの「まとめて確定」の動きを確認してみましょう。