イチから全部作ってみよう(34)マルチプログラミングとトランザクション:山浦恒央の“くみこみ”な話(203)(2/3 ページ)
ソフトウェア開発の全工程を学ぶ新シリーズ「イチから全部作ってみよう」。第34回は、週末の家事のたとえ話でマルチプログラミングについて理解した上で、データベースにおけるトランザクションについて解説する。
3.前回の振り返り
前回は、排他制御についてトイレの例を使って説明しました。上記のマルチプログラミングの延長として、「3人がバラバラに同じ仕事(「トイレ」で用をたす)をする」と考えると分かりやすいと思います。
| トイレの話(前回) | プログラムの世界 | プログラムの用語 |
|---|---|---|
| トイレ(家族全員で共有) | データベースの在庫数など | 共有資源 |
| 複数人が同時にトイレに入ろうとする | 複数の処理が同時に同じデータを更新しようとする | 競合状態 |
| 内側からカギを掛ける | 他の処理がアクセスできないように占有する | ロック |
| カギを開けてトイレから出る | 占有を解放する | アンロック |
| トイレ使用中は外で待つ | ロックを解放するまで処理を停止する | 待機 |
| トイレ内でカギを掛けたまま倒れる | ロックが解放できないまま処理が停止する | ロックの解放漏れ |
| 表1 トイレの例とプログラムの世界/プログラムの用語の対応 | ||
今回は、さらにもう一歩進めてトランザクションの概要について説明します。
4.トランザクション:一連の処理をまとめたもの
トランザクションとは、データベースに対する一連の処理をひとまとめにし、全て成功した場合だけ確定する仕組みです。トイレの例で考えると、「トイレに入ってから出るまで」の一連の流れが、1つのトランザクションに相当します(図1)。
図1の「★から★」の範囲全体がトランザクションです。トランザクションを定義することで、どこからどこまでを1つの処理として扱うか明確にできます。なお、ロック(カギをかける)は、トランザクションそのものではなく、トランザクション内で使用する手段の一つです。
5.成功時はコミットと失敗時はロールバック
トランザクションは、一連の処理をまとめるだけでなく、全て成功した場合は確定し、途中で失敗した場合は元の状態に戻す仕組みがあります。
例えば、旅行予約で考えてみます(図2)。
これらの予約が全て成功した場合には、処理を確定する「コミット」を行います。一方、どれか失敗した場合は、「ロールバック」によって、行った処理を全て取り消して元に戻します(表2)。
| 結果 | 処理 | 意味 |
|---|---|---|
| 全て成功 | コミット | 処理を確定する |
| 1つでも失敗 | ロールバック | 全てを取り消して元に戻す |
| 表2 ロールバックとコミット | ||
なお、ホテル予約、飛行機チケット予約、レンタカー予約が別々のサイトやサービスで行われている場合は、全てをロールバックできない可能性があります。
Copyright © ITmedia, Inc. All Rights Reserved.

