こちらの本で学んだことの備忘録第2段。
実務で頻繁に使うのは、おそらく四大命令などデータの出し入れ等の操作をする命令なんだろう。
だけどDBMSにおいて、前提となる最重要事項は安全で確実なデータ操作・管理であり、トランザクションや安全性を保つ為の仕組みを理解していないと大変なことになりかねないんだろうなと思ったので、備忘録を書いておく。
ACID特性とは
「データを正確かつ安全に取り扱うために、システムが備えるべき4つの特性」として、ACID特性というものがある。ACIDというのは、以下4つの頭文字。
・Atomicity 原子性 (処理が中断しても中途半端な状態にならない)
・Consistency 一貫性 (データの内容が矛盾した状態にならない)
・Isolation 分離性 (複数の処理を同時実行しても副作用がない)
・Durability 永続性 (記録した情報は消滅せず保持され続ける)
ここから、これらACID特性を保つためにDBMSに用意されている、様々な安全機構を紹介していく。
トランザクションとは
データベースの安全機構に不可欠なものとして、トランザクションという仕組みがある。
DBMSに対して複数のSQL文を送る際、1つ以上のSQL文をひとかたまりとして扱うように指示をすることができるが、このかたまりのことをトランザクションという。
DBMSではトランザクションを次のように扱う。
・トランザクションの途中で、処理が中断されないようにする。
・トランザクションの途中に、他の人の処理が割り込めないようにする。
DBMSがこのようにひとかたまりのSQL文を扱うことをトランザクション制御という。
コミットとロールバック
DBMSによるトランザクション制御①
DBMSは、トランザクションに含まれるすべてのSQL文について、必ず「すべての実行が完了している」もしくは「1つも実行されていない」のどちらかの状態になるように制御する。
この制御を実現するために、コミットとロールバックという仕組みが使用される。
ACID特性のひとつ、「原子性」を守っている。
・コミット
トランザクション中のSQL文によってテーブルのデータが書き換えられると、それらは仮のものとして管理される。そしてトランザクションが終了するときに、仮の書き換えを全て確定させる。このように確定させることをコミットという。
・ロールバック
トランザクション中に何らかの異常が発生して中断した場合、DBMSはそれまで行った仮の書き換えをキャンセルして、無かったことにする。この無かったことにする動作をロールバックという。
分離レベル・ロック
DBMSによるトランザクション制御②
DBMSは、あるトランザクションを実行する際、ほかのトランザクションから影響を受けないように分離して実行する。
この制御を行うために、ロックと呼ばれる仕組みが使用される。
ACID特性のひとつ、「分離性」を守っている。
・ロック
あるトランザクションが現在読み書きしている行に鍵をかけ、他の人のトランザクションからは読み書きできないようにする。
・トランザクション分離レベル
自分が読み書きしたい行を他人がロックしている間は、その相手のトランザクションが完了するまで自分は待たされるので、ロックが大量に発生するとデータベースの動作速度低下につながってしまう。この副作用を克服するため、多くのDBMSではトランザクション分離レベルを指定することができる。
データ型・制約
ここまで挙げたトランザクションを使った仕組みは、システム的なデータ異常を防いでくれるものの、人為的なミスに対しては効力を持たない。
そこでデータベースが意図しない値を格納できないように、あらかじめデータ型に制限をかけたり制約を使用する。これにより、ACID特性のひとつ、「一貫性」を守っている。
制約の種類
・NOT NULL 制約
NOT NULL制約が設定された列にはNULLの格納が許可されない。また多くの場合NOT NULL制約は、DEFAULT指定と組み合わせて使用される。
・UNIQUE制約
ある列の内容が重複してはならない場合は、UNIQUE制約を付ける。なおUNIQUE制約がかけられていても、「NULLはNULLとも等しくない」ため、NULLが格納された行が複数存在することは許される。
・CHECK制約
ある列に格納される値が妥当であるかを細かく判定する場合は、CHECK制約を使用する。CHECKの後ろのカッコ内に記述した条件式が真となる値だけが格納を許される。
・主キー制約
主キーの役割を担う列には、主キー制約(PRIMARY KEY制約)をつけることで、「NULLも重複も許されない列」であることに加えて主キーの役割を担うという意味を持つ。
・外部キー制約
参照整合性(外部キーが指し示す先に、きちんと行が存在して関係性が成立していること)が崩れるようなデータ操作をしようとした場合にエラーを発生させ、処理を中断させる制約として外部キー制約(FOREIGN KEY制約)を使用する。この制約は、参照元のテーブルの外部キー列に設定する。
バックアップ
ACID特性の4つ目、記録した情報を保持し続ける「永続性」を守るため、多くのDBMSではバックアップの仕組みを備えている。
バックアップには、以下2つの方式がある。
・オフラインバックアップ(DBMSを停止して行うバックアップ)
整合性を保ちつつ、最も簡単に行う方法。
・オンラインバックアップ(DBMSを稼働させながら行うバックアップ)
オフラインバックアップ中は一切データ処理が行えなくなるため、多くの場合は、稼働しながらも整合性のあるバックアップデータを取得できるオンラインバックアップを行う。
・ログファイルのバックアップ
通常のバックアップは1日ごとなど低頻度で行われるが、この間を補完するため、データベースが出力するログファイルを高頻度でバックアップする。なお障害発生時に、ログに記録されているSQL文を際実行して障害が発生する直前の状態までデータを更新する処理のことをロールフォワードという。
引用・参考文献