TOPシステムトレンド> トランザクションについて
近未来データベース
近未来データベース

第3回:データベースのスケールアウト(後半)
著者:NTTデータ先端技術  鈴木 幸市   2005/9/1
前のページ  1  2  3
トランザクションについて

   ここで少しトランザクションの問題について解説したいと思います。
トランザクションの必要性

   複数のサーバにデータが分割格納されている場合、アプリケーションでSQLを2つのデータベースに振り分けることができれば、2つのデータベースはうまく動きそうに見えます。

   確かにこれが可能なこともありますが、一般的にはそううまくいくケースばかりではありません。これを理解するには、「トランザクション」という考え方を理解する必要があります。少しトランザクションについて解説した後に、この問題に戻ることにしよう。


トランザクションとは

   SQL言語では、トランザクションはCOMMIT文やROLLBACK(あるいはABORT)文で指示することになっています。これらのコマンドはアプリケーションで意味がある処理の後(例えば、送金処理で相手の口座の情報と自分の口座の両方の情報をきちんと更新した後)に発行できます。アプリケーションがうまく処理できた場合には、COMMIT文を、失敗して処理を取り消したいときにはROLLBACK文を発行します。

   COMMIT文を発行すると、データベースはトランザクション内の「すべて」のデータベース更新を「確定」し、その後何か障害が起こっても結果が失われないように保証してくれます。ROLLBACK文を発行すると、このトランザクションは破棄され、このトランザクション内の「すべて」のデータベース更新は無効になり、元に戻ります

   この「すべて」は大変重要です。トランザクションの中のデータベースの更新が「すべて」確定するか、「すべて」無効になるかどちらかしかないということを、トランザクションの「原子性」といい、トランザクションの大変重要な性質の1つです。

   COMMIT文を発行せずにアプリケーションが終了してしまった場合(バグやリソース不足やシステムエラーなど)は、ROLLBACK文が発行されたと同じで、トランザクションは無効になります。重要なことは、トランザクションが何かはアプリケーションが決めるのであって、データベースが決めるものではないといことです。

   トランザクションがCOMMITあるいはROLLBACKするまでは、トランザクション内で行ったデータベースの書き換えは「仮」であって確定していません。このような中途半端な状態が他のトランザクションからどう見えるかは、いくつかの水準が規定されています。

   例えば「仮」のものを見せたり、「確定」したものだけを見せたり、あたかも全部のトランザクションが1つ1つ逐次に処理されたかのように見せたりすることができます。当然、データベースとしては後者になるほど処理量が増え、トランザクションの間での待ち合わせのための時間が増えるので効率は下がっていきます。


2つのデータベース

   2つのデータベースにデータが分散配置されている場合を考えましょう。アプリケーションが実行したいトランザクションは図6のようなものとします。つまりデータベース1にはAさんの預金残高があり、データベース2にはBさんの預金残高があるものとし、AさんがBさんに1万円送るとします。

2つのサーバにまたがったトランザクション
図6:2つのサーバにまたがったトランザクション
(画像をクリックすると別ウィンドウに拡大図を表示します)

   処理は単純で、データベース1のAさんの預金残高から1万円を引き、データベース2のBさんの預金残高に1万円を加えるだけです。その後で、データベース1にCOMMIT文を出し、データベース2にもCOMMIT文を出すことになります。

   果たしてこれでよいのでしょうか?この間に何もエラーが起こらなければよいのですが、コンピュータシステムはいつダウンするかわからないのです(そうなってほしくはないのですが、可能性はいつでもあるのです)。確率が数万分の1であっても、このような問題への対応をしておかなければなりません。

   運悪くデータベース1でCOMMITした後で、データベース2をCOMMITする前にシステムエラーが起こってデータベース2がクラッシュしてしまったとすると、Aさんの口座からは1万円がなくなっただけであり、Bさんの口座にはこれが届かず、Aさんは損をしてしまいます。2つのデータベースがそれぞれ独立に動いているだけでは、このような事態には対応できないのです。

   このようなことがないように、データを分割した場合には、関係するデータベースがきちんと調和をとって実行できるようにしなければなりません。代表的な方法として、二相コミットが知られています。


次回は

   次回はデータベースをスケールアウトする際に、データのコピーをサーバの間で持っておく方法について解説します。

前のページ  1  2  3


NTTデータ先端技術株式会社 鈴木 幸市
著者プロフィール
NTTデータ先端技術株式会社  鈴木 幸市
Unixにおける日本語ハンドリング、Oracleの移植、オブジェクトリレーショナルデータベースのエンジンの開発などに携わる。現在、NTTデータ先端技術にてLinux、PostgreSQLなどのオープンソースソフトウェアに関する技術を統括している。著書に「RDBMS解剖学」(翔泳社)、訳書に「オブジェクト指向データベース入門」(共立出版)など。


INDEX
第3回:データベースのスケールアウト(後半)
  はじめに
  実現性は?
トランザクションについて