日頃,システム構築の開発現場において「トランザクション」という言葉をたびたび耳にします。Part1では,トランザクションの初歩の初歩から分散トランザクション技術までを解説していきましょう。

 企業における業務処理の多くは,「確実に遂行されること」が求められます。例えば,「本日の取引は10件で,たぶんすべて成功したと思います」という報告ではなく,「本日は10件の取引を行い,すべて成功裏に完了しました」という報告が必要なわけです。

 業務はITを活用することにより効率的に進められますので,ITの世界ではそれぞれの取引が確実に「成功する」ことを保証する仕組みが必要になります。この取引のことを「トランザクション」と言います。具体的には,データベースにアクセスする処理を処理1,処理2,処理3のようにつなげて呼び出す「一連の処理」(処理の固まり)です(図1)。

図1●トランザクションとは<br>“一連の処理”を“ひとかたまり”で処理する。
図1●トランザクションとは
“一連の処理”を“ひとかたまり”で処理する。
[画像のクリックで拡大表示]

 トランザクションは,次の4つの特性をすべて保証しなければなりません。

原子性(Atomicity)

トランザクションは,すべてが完全に実行されるか,全く実行されないかどちらかです。つまり,トランザクションを構成する「一連の処理」は,これ以上分割できない最小単位です。

一貫性(Consistency)

トランザクションの開始時と終了時で,データが整合性を保っていなければなりません。データは以前の「有効な状態」から新しい「有効な状態」に変化します。

隔離性(Isolation)

複数のトランザクションを同時に並行して実行しても,終了するまでトランザクション同士はお互いに干渉しません(あるトランザクションからほかのトランザクションは見えません。あるいは,ほかのトランザクションの影響を受けません)。

持続性(Durability)

トランザクションが正常に終了した結果は必ず「永続化」され,障害によって失われることはありません。

 これらの「トランザクション特性」のことを,頭文字を取って「ACID」(アシッド)と呼び,ACIDを満たすトランザクションを「ACIDトランザクション」と言います。逆に言うと,この特性に当てはまる業務処理をシステムで実装する場合に,トランザクションの機能を利用するメリットを享受できるのです。この4つをすべてクリアした場合,「トランザクション特性」を満たすと言います。

 銀行の送金処理を例にトランザクション特性を具体的に見ていきましょう。

 AさんがBさんに10万円送金する場合,Aさんの口座から10万円引き出され,Bさんの口座に10万円預け入れされる処理が「一つのトランザクション」として実行されます。「原子性」の特性から,引き出し処理と預け入れ処理のどちらか一方のみが成功し,他方が失敗することはありません。

 もし,Aさんの預金残高が10万円未満の場合,10万円を引き出すと口座は「有効な状態」ではなくなります。このため,「一貫性」の特性から,トランザクションは不成立となり元のままの状態になります。

 また,「隔離性」の特性により,トランザクションを開始し,引き出し処理と預け入れ処理が完了する途中の段階で,AさんやBさんの口座にアクセスすることはできません(ロックされます)。さらに,「持続性」の特性から,トランザクションが完了したAさん,Bさんの口座情報は永続化され,次の処理のために利用できなければなりません。

トランザクション境界を指示する

 トランザクションを開始する際は,「原子性」を保証するために,トランザクションの開始と終了を明示的に指定する必要があります。開始から終了までの範囲を「トランザクション境界」と言います(範囲やスコープと呼ぶこともあります)。

 トランザクション境界は,アプリケーション用のAPI(後述するTPモニターが用意するAPIやSQLなど)で設定する場合と,Java EEに含まれるEJB(Enterprise JavaBeans)のCMT(Container Managed Transaction,コンテナ管理トランザクション)のように,自動的に設定する場合の2種類があります。前者を「プログラミング的トランザクション」,後者を「宣言的トランザクション」と呼びます。宣言的トランザクションを利用する場合は,アプリケーションロジック内にトランザクションに関するAPIをコーディングする必要がなく,保守性や柔軟性に優れたアプリケーションを開発できます。

 トランザクションの終了方法は,トランザクションの処理結果が正常な場合と異常な場合で異なります。正常終了の場合は,トランザクションの結果を永続化します。これを「コミット(commit)」と言います。異常終了の場合は,トランザクションの取り消し,つまり開始前の状態に戻す必要があります。この処理を「ロールバック(rollback)」と言います。トランザクションの開始,終了を含めて,ACID特性を保証するための仕組みを「トランザクション管理」と呼びます。