pafuイーランスクール 学んでできる

メニューへ戻る

データベース管理システム(データベース)

学習のポイント

データベース管理システムの「データベース制御」について学習します。トランザクションとACID特性(アジッド特性)、コミット・ロールバック・ロールフォワード、排他制御とロック・デットロック、2相コミットメント、ストアドプロシージャについて理解しましょう。

1. データベース管理システム(DBMS)
DBMS」とは、「データベース管理システム」とも言います。これは、ユーザとデータベースの間に介在してデータベースの利用を支援するものです。以下の機能があります。
データベースの定義
デーベース操作
データベース制御
データベース管理システムでは、「ひとかたまりの処理」を「トランザクションといいます。例えば、Aさんへ10000円を振り込む場合を考えてみましょう。
1. 自分の口座から10000円金額を減算する
2. Aさんの口座へ10000円を加算する
この2つの処理は、両方完結しないと大変なことになってしまいます。上記の1と2を併せて1つのトランザクションということになります。 トランザクションが持つべき特性を表したものが「ACID特性(アジッド特性)」です。以下の4つの特性があります。

A(Atomicity 原子性)
トランザクションはそれ以上分割できないこと。
C(Consistency 一貫性)
トランザクションの実行結果は、データベースの内容を矛盾させないこと。
I(Isolation 独立性)
複数のトランザクションを同時並行に実行してもそれぞれ順次実行した場合と同じ結果が得られる。つまり、他のトランザクションの影響を受けないこと。
D(Durability 耐久性)
トランザクションが正常に実行された場合、その結果は、システム障害などて消失することはない。

2. コミット・ロールバック・ロールフォワード
トランザクションを実行するにあたっては、以下の5つの項目を把握する必要があります。

●コミット
トランザクションを構成するすべてのSQL文の実行が完了することを「コミットする」といいます。
●ロールバック
障害発生時に処理途上でコミットされていないトランザクションの処理をすべて取り消し、最初の時点に戻すこと。
●ロールフォワード
ロールバックにより取り消されたトランザクションを再実行すること。
●ジャーナルファイル
トランザクション開始前・コミット後の状態を保存したファイルのこと。これを利用して、上記の「ロールバック」や「ロールフォワード」が実現できる訳です。
●チェックポイント
DBMSでは、ある時間間隔でデータ操作結果をデータベース本体へ書き込んでいます。このタイミングをチェックポイントといいます。

では、上記を踏まえて、以下のように実行されているトランザクションを考えてみましょう。
T1~T5の5つのトランザクションがあります。この時、ある時点でシステム障害が発生しました。この場合、ロールバック・ロールフォワードされるトランザクションは考えてみましょう
●T1…何の問題もなく結果が保証されます。T1は,チェックポイントでデータファイルに同期済みのため,再起動時に何の処理も行う必要がありません。
●T3とT5…時刻Tmでトランザクションが実行中だったT3とT5は、再起動時にロールバックによって「なかったこと」とされてしまいます。ログファイルが完全ではないためロールフォワードもできないので,ユーザが手動で再実行するしかありません。
●T2とT4…この2つは,障害前にトランザクションが終了しているため,結果は保証の対象となります。ただし,T1と違って,チェックポイントより後にもトランザクションが実行されているため,データファイルはまだ同期されていません。変更履歴が残っているのはログファイルだけですので,「再起動時にロールフォワードが実施されます」。
3. 排他制御
あるデータベースで1つのデータ資源を複数の異なるトランザクションがほぼ同時に更新しようとした場合に、「排他制御」が必要となります。 例えば、田中さんの銀行口座の残高が5万円だっ場合、1万円の入金処理Aと2万円の入金処理Bという2つのトランザクションがあったとします。トランザクションAの処理の途中で、トランザクションBの処理が完了した場合、最後にトランザクションAでの1万円の加算処理がなされ、結果として、6万円の残高となってしまいます。これを「ロストアップデート」といいます。このようなことがないようにDBMSには、排他制御という機能があります。排他制御とは、あるトランザクションが実行中、他のトランザクションが入ってこないようにすることです。以下の2種類の方法があります。 この方法には以下のものがあります。

専有ロック
データの書き込み時にロックをかけます。つまり、登録・更新・削除の時にロックをかけ、他のトランザクションは、一切の処理はできません。
共有ロック
読み込み時にかけるロックです。他のトランザクションは、登録・更新・削除はできませんが、読み取りはできます。

デットロック
排他制御によって、データの矛盾はなくなりますが、やっかいな現象が起きる場合があります。それが「デッドロック」という「お互いに相手の資源解放の待ち状態」になることです。 例えば、トランザクションAは、資源Xにロックをかけ、トランザクションBは、資源Yにロックをかけた場合、トランザクションAは、資源Yを利用したい、トランザクションBは、資源Xを利用したい、という現象が発生した場合、互いのロックの解除の待ち状態になってしまいます。デットロックが発生した場合は。いずれかのトランザクションを強制終了させて再実行するようにします。
4. 2相コミットメント
口座Aを管理しているデータベースと口座Bを管理しているデータベースがあった場合、2箇所に分散しています。このような場合は、両方のデータベースから準備完了の応答があった時のみ、両方に対してコミット指示を出します。どちらか一方でもエラー応答があった場合は、両方に対してロールバック指示を出します。

とりあえず各データベースを更新し、結果報告をする(第1相)
結果報告に応じて、各サイトの状態を確認してから全コミット/全ロールバックを指示(第2相)

という2段階でトランザクションを制御します。
この方法は、「すべてが確実に更新を反映された状態」と「すべてが何もなかった状態」のどちらかになります。
5. ストアドプロシージャ
ストアドプロシージャとは、データベースに対する一連の処理をまとめ、データベース管理システムに保存したもので、クライアントから引数を渡してそれに基づいて処理を行ったり、クライアントに処理結果を返したりすることもできます。 通常のようにSQL文と違い、ネットワークのトラフィックを削減でき、サーバ上で構文解析や機械語への変換を前もって終わらせておくため、処理時間の軽減にもつながります。
6. データベースの再編成
データベースに対して、登録・更新・削除を繰り返していると、ディスクの記憶領域に細かい空き領域がたくさん発生してしまい、処理効率が低下してしまいます。このように空き領域を整理することを「再編成」といいます。
7. オプティマイザ
SQL文を高速に実行するために、最も効率の良いアクセスパス「表から目的のデータを取り出す経路」を選択するDBMSの機能のこと。
8. クエリの実行までの流れ
DBMSがSQL文で記述されたクエリ(問合せ)を実行する手順は以下のようになります。

1. 構文解析…SQL文の文法のチェックを行う。
2. 最適化…クエリを実行するための最も効率的なアクセス経路を選択します。
3. コード生成…最適化されたアクセス経路にしたがい、DBMSが実行するコードを生成する。

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる