データベースは下の図のように、データを蓄積する部分とそれを操作するエンジン(
RDBMS)で構成されます。
ユーザは SQL言語でRDBMSに命令を送ることで、データベースを操作します。
それぞれが独立していることで、ExcelやAccessといったファイルとは異なる形でデータを操作することになります。
ここでは、具体的にRDBMSがどんな仕事をしているのかを見ていきましょう。
データの管理
RDBMSは、データを登録したり、削除したり、更新したりといったデータに関わるすべてのデータの管理を行います。
その際に、データを正しく保つためのルールを守るもこともデータ管理の一つです。
これを、データの整合性を管理すると言います。
データの整合性の管理には主に次の2つがあげられます。
- キー制約
- 参照性制約
キー制約は、表に重複したデータを登録しないためのルールです。
表の中に、データを特定するための項目を作り、重複したデータが登録されたときに、RDBMSがエラーを返します。
このようなデータを特定するための項目を、主キーと言います。
上の図では、顧客番号がC001のデータを登録しようとしています。
しかし、すでに顧客番号C001は存在しているため、RDBMSが登録できないというエラーを返しています。
参照性制約は、複数の表の間でデータの矛盾が発生しないようにするためのルールです。
例えば、上の図のように販売リストの顧客番号と顧客リストの顧客番号が関連付けられている時、顧客リストから顧客番号C001のデータを削除しようとすると、販売リストでこの顧客番号は使われているため、RDBMSは削除できないというエラーを返します。
Excelなどのファイルを利用している場合には、これらの管理を自分で行わなければなりませんが、RDBMSを利用するとすべて自動で行うので、私たちはデータベースを設計する際に、適切なルールを決めることに注力できます。
トランザクションの管理
トランザクションとは、データベースを更新するとき、途中で区切ることのできない処理のまとまりの事です。
銀行の入出金システムを例にとって考えてみましょう。
銀行の業務の中では、指定の口座から別の口座にお金を移動させることがあります。
例えば、Aさんの口座から5万円をBさんの口座に送金するような場合です。
Aさんの口座残高を減らす処理とBさんの口座残高を増やす処理を、連続して行う必要があります。
もし、Bさんの口座に対する処理に失敗した場合、Aさんの口座からは預金が減る一方、Bさんの口座残高は増えず、お金が消えてしまうことになり、データに不整合が発生してしまいます。
このような場合、Aさんの口座に対する処理とBさんの口座に対する処理を、途中で区切ることのできない1つの処理としてまとめます。
このひとまとまりの処理を、トランザクションと言います。
すべての処理が成功した場合にのみ、口座に対する変更内容を確定するようにします。 (これをコミットと言います)
また、処理が一部でも失敗した場合は、すべての処理が取り消されます。 (これをロールバックと言います)
このため、口座に対する変更は発生せず、データの整合性が維持されます。
トランザクション処理は、一連の処理の途中で何らかのトラブルが発生したときに、データの破損を最小限にすることを目的とした処理です。
これにより、万が一トラブルが発生した場合にも復元する作業が簡単にすみます。
同時実行制御管理
同時実行制御管理とは、複数のユーザが同時に同じデータにアクセスしたとき、データに矛盾が発生しないようにする仕組み です。
例えば、AさんとBさんが映画館の座席予約をしているとします。
空席は1席だけでした。
AさんとBさんが同時に最後の1席を予約したとすると、どちらが最後の1席を予約することができるでしょう。
RDBMSは ロックアンロック制御を使い、一人がアクセスしている間は他の人は同じデータにアクセスできないようにします。
ロックとは鍵の事です。
Aさんが予約をしている間、空席情報用のデータに鍵をかけて(ロックする)、他の人がそのデータを操作できないようにします。
Aさんの作業が完了したところで鍵を解除して(アンロックする)、他の人もデータを操作できるようにします。
ロックには、共有ロックと占有ロック(排他ロックとも言う)の2種類があります。
例えば、Aさんが共有ロックをかけると、Bさんは空席状況は確認できるけれど予約はできません。Aさんが占有ロックをかけると、Bさんは空席状況の確認すらできないので、この場合BさんはAさんの作業が完了するまで、じっと待っているしかありません。
同時実行制御は、データの矛盾を防ぐにはとても良い仕組みなのですが、状況によっては困ったことになることもあります。
例えば、映画館の空席が2席あったとしましょう。
AさんとBさんが同時に予約を開始しました。
Aさんは1席目を予約し、引き続き2席目を予約しようとします。
ところが、2席目はBさんの操作によってロックがかかっています。
このような場合、2席分のロックが解除されない限りお互いに2席分の予約を完了することができません。
このように、お互いにロックが解除されるのを待ち続ける状態を、デッドロックと言います。
この処理の場合、一人のユーザがすべての座席予約を完了するまでが1つのトランザクションになっています。
デッドロックは、2つ以上のトランザクションがお互いのロックを解放するまで待ち続けるため、処理が中断してしまう状態です。
これを回避するには、トランザクションの単位を可能な限り小さくする(この場合で言うと座席予約は1席ずつしか取れないようにするなど)ことを心がけるとよいでしょう。
また、データを更新する順番を決めておくことも有効です。
例えば、座席番号の昇順から優先して予約がとれるなどです。
多くのRDBMSは、タイマー監視機能をサポートしています。
待ち時間が一定時間以上続いた場合には、後から起動したトランザクションを強制的にロールバックすることで、デッドロックを回避できるようになっています。(この場合ロールバックされたトランザクションは、もう一方のトランザクションが正常に完了した後で再実行されます)
障害復旧管理
データベースに登録されているデータは非常に大切なものです。
何らかのトラブルによって発生するデータの破損を最小限にとどめるのもRDBMSの仕事です。
これには、前述したトランザクションの仕組みを利用します。
トランザクションが失敗した場合、すべての処理が取り消され、前の状態に戻すのがロールバックでしたね。
また、トランザクションが正常に終了した場合は、内容を確定するコミットを行います。
トランザクションが開始されると、メモリ上にログ情報が作成されます。
ログ( log )とは、データベースに対する処理の履歴です。
この中には変更前のデータベースの状態も含まれています。
ログ情報は、コミットのタイミングでログファイルに情報が書き込まれます。
そして、トランザクションの終了時にこのログ情報をもとに、コミットまたはロールバックが行われます。
ログファイルは、データベースに対して行われたすべての操作の履歴を管理するファイルで、次の2つのタイミングで更新されます。
- データベースがコミットされたとき
- 一定の時間が経過したとき
一定時間ごとのタイミングを、チェックポイントと言います。
何らかの障害が起きた時、RDBMSはすみやかにシステムを再起動します。
その時、次の順番で処理を行います。
- ログファイルを読み込んで、最後のチェックポイントを確認する
- 障害発生時からチェックポイントまでのログを確認し、コミットしていない処理(中途半端になっている処理)をロ ールバックする
- チェックポイントから障害発生時までのログを確認して、コミットしたトランザクションを再実行する
それでは、3ではコミットされているにもかかわらず、トランザクションを再実行するのはなぜでしょう。
コミットは、メモリ上で確定しているにすぎません。
ハードディスクに書き込まれているわけではないのです。
実際にハードディスクに書き込まれるのは、チェックポイントのタイミングです。
もし、コミットからチェックポイントまでの間に障害が発生した場合、ハードディスクに書き込まれておらず、メモリで確定したはずのデータでも内容が失われることがあります。
これを避けるために、3のようにコミットが済んでいても、トランザクションを再実行するわけです。
この処理を、ロールフォワードと言います。
セキュリティ管理
何度も言いますが、データベースに登録されているデータは非常に大切なものです。
大量の個人情報が流出したり、個人のfacebookなどが不正ログインされプライベート写真を盗まれたり、セキュリティ関連のニュースが世間をにぎわせています。
インターネット上で気軽にデータベースにアクセスできるのは非常に便利ですが、誰でも自由にアクセスできるのは非常に危険なことなのです。
悪意を持った人がデータベースにアクセスをして、データを改ざんすることもできます。
これを防ぐために、RDBMSはユーザ認証機能を持っています。
データベースに接続する際に、ユーザ IDとパスワードを使って、アクセス可能なユーザを識別します。
ただし、ユーザIDとパスワードが正しければ結局はアクセスできてしまうので、パスワードの管理には十分に気をつける必要があります。
RDBMSには、セキュリティ管理としてもう1つ、アクセスできるかどうかをデータごとに設定するアクセス制御があります。
例えば、空席情報は一般に公開するけれど、個人情報は非公開にするなどです。
また、情報を見ることはできるけれど変更はできないといったこともアクセス制御の1つです。
データの改ざんや情報の漏えいがないようにするには、アクセスできるユーザを制限したり、アクセス許可をしたユーザでもアクセスする機能を最小限にとどめるなどの対策をとる必要があります。
またこの他にもデータベースにいつ、だれが、どんな処理を行ったかを監視したり、データベースそのものを暗号化したりすることもできます。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】