タイトル
応用情報技術 - 基礎覚書き:データベース(トランザクション管理)
目的
この記事では、応用情報技術者試験の出題分野であるデータベースのトランザクション管理に関する覚書きを列挙する。
トランザクション
トランザクションとは、データの整合性を保つことを目的にデータベース操作の一連の流れをひとまとめにした処理範囲または、処理単位を指す。
※ 排他が必要なデータだけ部分的に時系列で更新し、複数のトランザクションを並行実施可能にするMVCC(MultiVersion Concurrency Control:多版同時実行制御)制御技術もある。
また、トランザクションが持つべき性質として、以下 \(4\) つの特性があり、これをACID特性と呼ぶ。
-
原子性/不可分性(Atomicity)
トランザクション処理は、コミット(すべて実行される)または、ロールバック(一つも実行されない)のどちら一方の結果でなければならない。 -
一貫性/整合性(Consistency)
トランザクション前後でデータの整合性が保ち、一貫したデータを確保しなければならない。 -
独立性/隔離性(Isolation)
トランザクション実行中の処理過程には、別トランザクションも含む外部から干渉できてはならない。 -
耐久性/永続性(Durability)
一旦正常終了したトランザクションの結果は記録され、システム障害が発生しても失われず、障害発生直前の状態に復旧できなければならない。
排他制御
排他制御は、上記の一貫性/整合性を満たすため、一度に一つのトランザクションしか更新を許さない仕組みで、排他制御する手段として次の方法がある。
-
共有ロック
データ(レコード)参照する場合のロックで複数トランザクションで同時ロックできる。
他のトランザクションがデータの更新だけでなく参照権限までロックしないようデータ参照していることを知らせる共有するロック。 -
専有ロック(排他ロック)
ロック中は、他トランザクションからの更新、参照ができない状態となる。
※ レコードを更新後、コミット時に必ず一時的に専有ロックがかかる。 -
デッドロック
トランザクション同士で互いに同じテーブルのロック解除を待ち、互いに待機状態となり、トランザクションを実行できない状態に陥ることを指す。
デッドロック は、すべてのトランザクションでテーブルの更新順を統一すれば、ほとんど回避できる。 -
\(2\) 相ロック(ツーフェーズロック)
全トランザクションにおいて、参照や更新によらず、全てのロックが完了状態となるまでアンロックを実施しないロック制御方法。
このとき、ロックが始まってから全てのロック処理が完了するまでの状態を単調増加、アンロックが始まってすべて解除されるまでの状態を単調減少という。
セマフォ
セマフォとは、共有の資源(リソース)に対して、利用制御する排他的な仕組みのことを指し、セマフォの値(セマフォ変数 \(S\))は、利用可能な資源数(リソース数)を表す。
また、プログラムリソースの占有有無によって、セマフォ変数 \(S\) が増減し、\(0\) の場合は、リソース解放待ちとなり、\(1\) 以上となるまで待機する。
このセマフォ変数 \(S\) の制御は、次の \(P\) 操作、\(V\) 操作で管理される。
-
\(P\) 操作(デクリメント)
資源をロックし、セマフォ変数 \(S\) を \(1\) つ減算して、セマフォを確保する。 -
\(V\) 操作(インクリメント)
資源をアンロックし、セマフォ変数 \(S\) を \(1\) つ加算して、セマフォを解放する。
データベース障害の回復処理
以下、大別したデータベース障害とその回復方法。
-
トランザクション障害
メモリ不足やデッドロックに伴う強制終了などにより、トランザクションが異常終了する障害。
DBMS に異常はないため、ロールバックにより障害前の状態へ戻すことで復旧する。 -
ソフトウェア障害(電源要因)
ソフトウェア側の予期せぬ停止などで DBMS のデータに不整合(不具合)が起こる障害。
データ復旧には、次で触れるログファイルによる障害復旧で操作履歴を遡り、不整合がない状態までデータを戻すか、不整合がない状態までデータを補う形で復旧する。 -
ハードウェア障害(媒体要因)
ハードディスクの故障等でデータ自体が破損する障害で、日次など定期的に取られるバックアップデータから復旧する。
バックアップ後に更新されたデータについては、次で触れるログファイルによる障害復旧で操作履歴を遡り、不整合ない状態までデータを戻すか、本来できるはずだったデータを補う形で復旧する。 -
ログファイルによる障害復旧対策
データベース障害に備え、データベース用のハードディスクとは別のハードディスクに更新前データと更新後データをログファイルとして常に出力し、データ復旧する際に必要となる情報を記録する。
また、トランザクションのコミット後であってもその状態をメモリ上に保持しており、ハードディスクへ書き込みしていない状態(タイミング)でデータベース障害が発生するケースもある。
このようなケースでもログファイルには、コミットしたタイミングでメモリ上に保持した状態を別ハードディスクへ記録しているため、障害によるデータ損失を最小限に抑えることができる。
上記の更新前のデータログから既にハードディスクに書き込まれた実行中のデータをトランザクション実施前に戻す復旧をロールバック(※)といい、更新後のデータログからトランザクションがコミットされ、記録されるはずだったデータを追加する復旧をロールフォワードという。
※ トランザクション管理が自動実行するロールバックと混同注意。
データベースの性能向上
データベースの性能を向上させる代表的なもので、テーブル更新毎にキーとデータの格納場所(ポインタ)を保持し、検索時に索引することで、検索速度を上げるインデックスがある。
※ インデックスは、フィールド(列)単位で設定するが、テーブル更新毎にインデックス情報を最新化する(更新する)ため、頻繁にテーブル更新を行うテーブルに設定すると、フィールド(列)の検索条件やテーブルのレコード数によっては、かえって処理速度が遅くなる場合があり注意が必要。
また、インデックス情報は、様々なデータ構造で持つことができるため、システム仕様やデータベース環境に応じて、検索対象や検索方法に適したデータ構造を選ぶ必要がある。
以下、代表的なインデックスのデータ構造。
-
\(B\)木インデックス(\(B\)-tree)
\(B\)木 は、予めキーを昇順などの規則で並べ、その中央値をルート(根)とし、木構造(※)にしたデータ構造で、ルート(根)から分岐探索することで検索処理を高速化する。このため、検索する対象範囲が決まっているBETWEEN等を用いた範囲検索に適しているが、順次処理や AND、OR のみの検索、NOT 検索には、適していない。
※ 木構造については、下記の先行ページを参照。 -
\(B+\)木インデックス(\(B+\)-tree)
\(B+\)木に適さない順次処理も高速化できるように木構造の最下層となるグループ(リーフ(葉)の集まり)同士の末尾と先頭をポインタでつなげ、ルート(根)から再評価をすることなく、次のグループ評価をできるようにしたデータ構造。 -
ビットマップインデックス
テーブルの各レコードとフィールドをマトリックス的にデータ化したビットマップというデータ構造で、検索値が検索対象に複数存在する場合に適している。 -
ハッシュマップインデックス
キー値からハッシュ関数(※)で求めた値をアドレス(番地)とし、レコードの格納位置をアドレスで管理する。検索の期待値が一意である場合に適しているがハッシュ関数結果が重複するシノニム(※)により一意に特定できない場合があり、この場合の対策として空きアドレス(番地) にデータを格納するオープンハッシュ法と、あふれ領域にデータを格納するハッシュチェイン法がある。
※ ハッシュ関数、シノニムについては、下記の先行ページを参照。
応用情報技術 - 基礎覚書き:アルゴリズム > 探索アルゴリズム
参考文献
- 瀬戸 美月 (\(2020\)) 『徹底攻略 応用情報技術者教科書』株式会社インプレス