UNISIA-SE Tech Blog

気まぐれお勉強日記

[応用情報技術] [基礎] [20] 覚書き : データベース(トランザクション管理)

1. 前提条件


このページでは、応用情報技術者試験の出題分野である データベースのトランザクション管理 に関する覚書きを列挙する。

一度内容を理解したことを前提とし、最低限の解説に留めていることに注意。

2. トランザクション


トランザクションとは、データの整合性を保つことを目的にデータベース操作の一連の流れをひとまとめにした処理範囲 または、処理単位 を指す。
※ 排他が必要なデータだけ部分的に時系列で更新し、複数のトランザクションを並行実施可能にする MVCC(MultiVersion Concurrency Control:多版同時実行制御) 制御技術もある。

また、トランザクションが持つべき性質として、以下4つの特性があり、これを ACID特性 と呼ぶ。

原子性/不可分性 (Atomicity)
トランザクション処理は、コミット(すべて実行される) または、ロールバック(一つも実行されない) のどちら一方の結果でなければならない。

一貫性/整合性 (Consistency)
トランザクション前後でデータの整合性が保ち、一貫したデータを確保 しなければならない。

独立性/隔離性 (Isolation)
トランザクション実行中の処理過程には、別トランザクションも含む 外部から干渉 できてはならない。

耐久性/永続性 (Durability)
一旦正常終了したトランザクションの結果は記録され、システム障害が発生しても失われず、障害発生直前の状態に復旧 できなければならない。

3. 排他制御


排他制御 は、上記の 一貫性/整合性 を満たすため、一度に一つのトランザクションしか更新を許さない仕組みで、排他制御する手段として次の方法がある。

共有ロック
データ(レコード)参照する場合のロックで複数トランザクションで同時ロックできる。
他のトランザクションがデータの更新だけでなく参照権限までロックしないようデータ参照していることを知らせる共有するロック。

専有ロック (排他ロック)
ロック中は、他トランザクションからの更新、参照ができない状態となる。
※ レコードを更新後、コミット時に必ず一時的に専有ロックがかかる。

デッドロック
トランザクション同士で互いに同じテーブルのロック解除を待ち、互いに待機状態となり、トランザクションを実行できない状態に陥ることを指す。
デッドロック は、すべてのトランザクションでテーブルの更新順を統一すれば、ほとんど回避できる。

2相ロック (ツーフェーズロック)
全トランザクションにおいて、参照や更新によらず、全てのロックが完了状態となるまでアンロックを実施しないロック制御方法。
このとき、ロックが始まってから全てのロック処理が完了するまでの状態を 単調増加、アンロックが始まってすべて解除されるまでの状態を 単調減少 という。

4. セマフォ


セマフォ とは、共有の 資源(リソース) に対して、利用制御する排他的な仕組みのことを指し、セマフォの値(セマフォ変数S) は、利用可能な 資源数(リソース数) を表す。

また、プログラムリソースの占有有無によって、セマフォ変数S が増減し、0 の場合は、リソース解放待ちとなり、1以上 となるまで待機する。
この セマフォ変数S の制御は、次のP操作V操作で管理される。

P操作 (デクリメント)
資源をロックし、セマフォ変数S を1つ減算して、セマフォを確保する。

V操作 (インクリメント)
資源をアンロックし、セマフォ変数S を1つ加算して、セマフォを解放する。

5. データベース障害の回復処理


以下、大別したデータベース障害とその回復方法。

トランザクション障害
メモリ不足やデッドロックに伴う強制終了などにより、トランザクションが異常終了する障害。
DBMSに異常はないため、ロールバックにより障害前の状態へ戻すことで復旧する。

ソフトウェア障害 (電源要因)
ソフトウェア側の予期せぬ停止などでDBMSのデータに不整合(不具合)が起こる障害。
データ復旧には、次で触れる ログファイルによる障害復旧 で操作履歴を遡り、不整合がない状態までデータを戻すか、不整合がない状態までデータを補う形で復旧する。

ハードウェア障害 (媒体要因)
ハードディスクの故障等でデータ自体が破損する障害で、日次など定期的に取られるバックアップデータから復旧する。
バックアップ後に更新されたデータについては、次で触れる ログファイルによる障害復旧 で操作履歴を遡り、不整合ない状態までデータを戻すか、本来できるはずだったデータを補う形で復旧する。

ログファイルによる障害復旧対策
データベース障害に備え、データベース用のハードディスクとは別のハードディスクに 更新前データ更新後データ をログファイルとして常に出力し、データ復旧する際に必要となる情報を記録する。

また、トランザクションのコミット後であってもその状態をメモリ上に保持しており、ハードディスクへ書込みしていない状態(タイミング)でデータベース障害が発生するケースもある。

このようなケースでもログファイルには、コミットしたタイミングでメモリ上に保持した状態を別ハードディスクへ記録しているため、障害によるデータ損失を最小限に抑えることができる。

上記の 更新前のデータログ から既にハードディスクに書き込まれた実行中のデータをトランザクション実施前に戻す復旧を ロールバック(※) といい、更新後のデータログ からトランザクションがコミットされ、記録されるはずだったデータを追加する復旧を ロールフォワード という。
※ トランザクション管理が自動実行するロールバックと混同注意。

6. データベースの性能向上


データベースの性能を向上させる代表的なもので、テーブル更新毎に キーデータの格納場所(ポインタ) を保持し、検索時に索引することで、検索速度を上げる インデックス がある。
インデックス は、フィールド(列)単位で設定するが、テーブル更新毎にインデックス情報を最新化する(更新する)ため、頻繁にテーブル更新を行うテーブルに設定すると、フィールド(列)の検索条件やテーブルのレコード数によっては、かえって処理速度が遅くなる場合があり注意が必要。

また、インデックス情報は、様々なデータ構造で持つことができるため、システム仕様やデータベース環境に応じて、検索対象や検索方法に適したデータ構造を選ぶ必要がある。

以下、代表的なインデックスのデータ構造。

B木インデックス (B-tree)
B木 は、予めキーを昇順などの規則で並べ、その中央値をルート(根)とし、木構造(※1) にしたデータ構造で、ルート(根)から分岐探索することで検索処理を高速化する。

このため、検索する対象範囲が決まっているBETWEEN等を用いた範囲検索に適しているが、順次処理やAND、ORのみの検索、NOT検索には、適していない。

※1 木構造については、下記の先行ページを参照。
[応用情報技術] [基礎] [5] 覚書き : データ構造:6. 木構造の分類
[応用情報技術] [基礎] [2] 覚書き : 応用数学:5. グラフ理論

B+木インデックス (B+-tree)
B木 に適さない順次処理も高速化できるように木構造の最下層となるグループ(リーフ(葉)の集まり)同士の末尾と先頭をポインタでつなげ、ルート(根)から再評価をすることなく、次のグループ評価をできるようにしたデータ構造。

ビットマップインデックス
テーブルの各レコードとフィールドをマトリックス的にデータ化した ビットマップ というデータ構造で、検索値が検索対象に複数存在する場合に適している。

ハッシュマップインデックス
キー値からハッシュ関数(※2) で求めた値をアドレス(番地)とし、レコードの格納位置をアドレスで管理する。

検索の期待値が一意である場合に適しているがハッシュ関数結果が重複する シノニム(※2) により一意に特定できない場合があり、この場合の対策として空きアドレス(番地) にデータを格納する オープンハッシュ法 と、あふれ領域にデータを格納する ハッシュチェイン法 がある。
※2 ハッシュ関数、シノニムについては、下記の先行ページを参照。
[応用情報技術] [基礎] [6] 覚書き : アルゴリズム:3. 探索アルゴリズム

※上記「インデックスのデータ構造」の参考サイト
データベース性能を向上させる「インデックス」を理解する。

以上。


【参考文献】
瀬戸 美月 (2020) 『徹底攻略 応用情報技術者教科書』株式会社インプレス


Copyright UNISIA-SE All Rights Reserved.
s-hama@unisia-se.jp