ソフトウェアとは、コンピュータが実行するプログラムやデータのことをいう。
ソフトウェアには基本ソフトウェア、ミドルウェア、応用ソフトウェアの3つに大別される。
基本ソフトウェアは、ハードウェアの管理・制御などを行うOS(オペレーティングシステム)をいう。
応用ソフトウェアは、いわゆるアプリケーションで利用者の業務に特化したソフトウェアのことだ。
そして聞き慣れないミドルウェアである。
これは、基本ソフトウェアと応用ソフトウェアの中間的な機能を果たすもので、DBMS(データベース管理システム)はそのミドルウェアの代表格である。
今回はDBMSについて観てみたい。

・DBMSとは何か
そもそもDBMSとは何かというと、利用者とデータベースの間に介在し、データベースの利用を支援するシステムの総称である。
DBMSがもつ機能は以下のように大別される。
・データベース定義機能
データ定義言語(DDL)を用いてスキーマを定義し、データベースを生成する機能。
・データベース操作機能
データ操作言語(DML)を用いてデータにアクセスし、データをデータベースに格納したり、データベースからデータを取り出す機能。
・データベース制御機能
データの整合性の確保や障害対応などの各種の制御を行う機能。
・トランザクション処理
データベースを用いたシステムでは、多くの場合トランザクションという単位で処理を行う。
トランザクションは、関連するいくつかの処理をまとめた一連の処理単位である。
例を挙げると、預金口座の入出金や電車の座席予約といった一連の不可分な処理単位であり、通常は複数の処理から構成される。
トランザクションは、次に示すACID特性という性質が保証されないといけない。
A : Atomicity 原子性
トランザクションは、完全に実行されるか全く実行されないかのいずれかである。
C : Consistency 一貫性
トランザクションの実行結果はデータベースの内容を矛盾させない。
I : Isolation 独立性
トランザクションは他のトランザクションから影響を受けない。
D : Durability 耐久性
正常終了したトランザクションの更新結果は、データベースから無くなることはない。
DBMSは、コミットメント制御や同時実行制御(排他制御)、障害回復機能などによりACID特性を保証する。
・コミットメント制御
トランザクションの原子性や一貫性を守るためには、トランザクションの実行が成功したときに限ってデータベースの更新内容を確定させないといけない。
このような制御をコミットメント制御という。
コミットメント制御では、更新内容を確定することをコミット(COMMIT)、実行が失敗したなどの理由により更新内容を取り消すことをロールバック(ROLLBACK)という。

・同時実行制御
異なるトランザクションが同じ資源を競合するとき、何も制御を行わなければ更新結果に不具合が生じる可能性がある。
例えば、同じ商品を販売する2人の担当者が、同時にトランザクションを実行すると、実行の順序によっては誤った結果を引き起こす。

この例だと、実際の在庫は10個なのに25個となってしまっている。
このような複数のトランザクションを同時に実行した場合の矛盾を防ぎ、各トランザクションを1つずつ実行したのと同じ結果が得られるようにすることを同時実行制御という。
同時実行制御では、主にロック方式による排他制御が行われる。
・ロック方式
トランザクションが資源(表や行など)に鍵をかけることで、そのトランザクションの参照・更新を拒絶する方法。
ロックされた資源は、ロックが解除(アンロック)されるまで、ロックしたトランザクション以外の参照や更新が制限される。

・ロックの種類
ロックは、占有ロック(更新ロック)と共有ロック(参照ロック)の2種類に分類される。
占有ロックは、主に資源の更新を伴うときにかけるロックで、他のトランザクションの参照・更新をいっさい許さない。
これに対して、共有ロックは、主に資源を参照するときにかけるロックで、他のトランザクションの共有ロックだけは許可する。
つまり、ある資源に対して共有ロックだけは同時にかけることができる。

・デッドロック
ロック方式による制御は問題が一つある。
複数の資源をロックする場合、資源をロックする順序によっては、トランザクションが互いにアンロックを待ち続ける膠着状態に陥り、処理が進まなくなる恐れがある。
これをデッドロックという。

この図から判断できるのは、資源をロックする順序が異なるトランザクションが一つでもあれば、デッドロックが発生する可能性がある。
このため、デッドロックを発生させないようにするためには、すべてのトランザクションで資源をロックする順序をそろえることが重要だ。
・障害回復機能
DBMSには、データベースに障害が発生しても正常に回復することが求められる。
トランザクションの異常終了やシステム障害などから、データベースを整合性が保たれた状態に回復させないといけないのである。
プログラムのエラーなどにより、トランザクションがコミットすることなく異常終了した場合は、トランザクションがそれまで行った更新をすべて取り消さないといけない。
反対に、コミット済みのトランザクションが行った更新が何らかの障害により磁気ディスク装置に反映されてないとき、それを確実に反映しないといけない。
障害回復には次の二つの処理が必要なのである。
・ロールバック
未コミットトランザクションが行った更新を取り消す。
・ロールフォワード
コミット済みトランザクションの更新を回復する。
ロールバックやロールフォワードを行うためには、トランザクションによる更新履歴を逐一記録したログ(ジャーナル)ファイルが必要だ。
ログファイルには、トランザクションがデータベースを更新するごとに、更新前の値と更新後の値を記録する。
ロールバックは、ログファイルの更新前情報を用いて、未コミットのトランザクションが行った更新を取り消す処理である。
実行中のトランザクションが、何らかの理由でコミット前に異常終了したときに行われる。
ロールフォワードは、ログファイルの更新後情報を用いて、コミット済みのトランザクションの更新を磁気ディスク装置に反映する処理である。
ロールフォワードは、主に磁気ディスク装置そのものの破損時(媒体障害時)に行われる。
このとき、新たな磁気ディスク装置にバックアップファイルの内容を格納し、バックアップ以降に実行されたコミット済みのトランザクションをロールフォワードする。

通常、データベースの更新はまずメモリ上に行い、磁気ディスク装置への更新の反映は一定期間ごとに行う。
しかし障害発生時に、どこまで磁気ディスク装置に反映されてるか把握できてないと、データベースの稼働開始時点までさかのぼる必要が生じ、回復に多くの処理が必要になる。
これを避けるために、チェックポイントと呼ばれるタイミングで、メモリ内容を磁気ディスク装置に書き出し、ログファイルとデータベースの内容を一致させる。

この図の例だと、T1はコミット後にチェックポイントがあるので、更新は確実に磁気ディスク装置に反映されているので、回復処理は不要である。
T2とT4はチェックポイント後にコミットしている。これはロールフォワードで回復する。(更新を反映する)
T3とT5は、障害によってコミットされないまま異常終了した。これらはロールバックで更新内容を取り消す。
・インデックス(索引)
データベースの性能を向上させる方法として、索引(インデックス)を利用する方法がある。
索引(インデックス)とは、索引キーと呼ばれる情報をデータの物理的な格納位置と対応付けたもので、例えるならば「本の目次」のようなものである。
データベースの表の特定の列に索引を設定し、その列をWHERE句などに指定して検索すると、索引から目的のデータの格納位置がすぐに得られるので、索引を設定していない場合と比べて、検索効率が向上する。
索引は、データの種類が多く重複の少ない列に設定すると効果的である。
たいていのDBMSでは、主キーに自動的に索引が付与される。
・B⁺木索引
B木を改良したB⁺木と呼ばれる多分木構造で索引を構成する方式である。
索引データは葉(最下位の節)の部分に格納する。

B⁺索引を設定すると、値の範囲を指定した検索において高い効果を発揮する。
・ハッシュ索引
検索キーのハッシュ値ごとに格納位置を管理する。
索引キーからハッシュ値を求めて目的の行データを得るため、特定の値に合致するものを検索する場合に高い効果がある。
ただし、不等号による大小比較や範囲指定検索などには効果が無い。
・分散データベース
分散データベースとは、物理的に異なる場所に配置された複数のデータベースを、論理的には一つのデータベースとして扱う仕組みである。
分散データベースで重要なのは、データやシステムが分散していることを利用者に意識させないことである。
データベースが分散された状態においては、データベース間で矛盾が生じないよう制御する必要がある。
この制御の手段として代表的なものが2相コミットメント制御である。
2相コミットメント制御では、更新の流れを2段階に分ける。
・第1段階
仮更新みたいなもの。各データベースは更新処理の成否を制御システム側に伝えた後、コミットもロールバックも選べる状態(セキュア状態)となってシステムの指示を待つ。
・第2段階
システムは各拠点からの回答を調べて、すべての拠点が更新可能な場合のみトランザクションをコミットする。
もし一つでもエラーがあれば、全体にロールバックする指示を出す。全体がそろわないと、トランザクションの原子性(Atomicity)が保持できないからである。

・後記
実を言うと、私は現在、結婚相談所に入会してて「婚活」している。
データベースは仕組みだけ知ってても面白くも何ともない。
実際に作業してみて初めてその良さが分かるというもの。
婚活が上手くいっても、そうでなくても、いずれ内容についてデータにまとめて紹介したいと思う。
