DBMSの障害対策:トランザクション処理 ACID特性 障害対策 ロールバックとロールフォワード について演習を行う。
キーワード: トランザクション処理 ACID特性 ロールバックとロールフォワード
(参考資料)
>> ITパスポート試験学習教材
>>テクノロジ系対策コース
>>第9章 データベース
9.5 トランザクション処理(1)
銀行口座をハッキング可能か? 思考実験する。
9.6 トランザクション処理(2)
ゲームのセーブポイントと、ロールバックロールフォワードを比較してみよう。
>>新基本情報技術者試験学習教材
>>テクノロジ系対策コース2
>>第3章データベース
3.18 トランザクション処理(1)
分散データベースのコミットメント処理
2相コミット プロトコル (欠点あり。処理がブロックされる。)http://www.ogis-ri.co.jp/otc/hiroba/technical/DTP/step2/
3相コミット プロトコル (2相コミットの修正版。調停者の障害、参加者のタイムアウトに対応。http://ossforum.jp/book/export/html/837)
3.19 トランザクション処理(2)
基本情報処理の過去問から 基本情報技術者 平成20年春期 午前問60
3.20 トランザクション処理(3)
ACID特性 と インデックスについて (関連項目:データ検索アルゴリズム)
(関連記事)
http://www.infiniteloop.co.jp/blog/2014/06/newcommerslide/
新入社員のための大規模ゲーム開発入門 サーバサイド編 今回の講義との関連: スライド55~74 排他制御 と インデックス設定の部分
食事する哲学者の問題 Wikipedia
■演習1(ビューとインデックス)
今まで自分が使用していたPC(出席登録参照)でWebサーバとSQLサーバを起動し、管理画面から演習を行う。
1つあるいは幾つかのテーブルを組み合わせてSELECT文で作成した一時的な表のことをビューと呼ぶ。
ビューに名前を与え、SQLでビューをテーブルとして利用することが出来る。
データベースで実際にレコードを記録するテーブルを実表と呼ぶ。
ビューは実表からselect文で作成された仮想表である。
上記は、
2つの実表を、 商品番号フィールドで結合して、1つの表にした
例である。
・データベース Accessでは、新規クエリの作成で、クエリビルダを利用し、 選択クエリー を作成する。 出来た 選択クエリー を実行して表示される 表 が ビュー に相当する。
Accessでは、選択クエリーに付けた名前がビューの名前になり、他のクエリーからその名前で参照できるようになる。
Q.Accessによる 履修登録データベース のクエリ―デザイン画面の例
どれが、テーブル(実表) で どれが ビュー(仮想表) か考えてみよう。
(クリックで拡大表示)
・MySQLでビューに名前を付けて保存しておくには、以下の構文を用いる。
CREATE VIEW ビューの名前 (表示項目,....) AS SELECT文
AS以下には今回まで解説してきた、SELECT 文を書くことが出来る。
()の部分は、AS以下のSELECTの実行の結果、得られる表に()内で指定したフィールド名を付け直して、新たなフィールド名を与える為の項目である。
select や delete や update で、FROM の次に、表名の代わりに、ビュー名を指定できる。
例)
students 表の firstname と lastname を結合し id と name と age のフィールドを持つ myview としてビューを作成
create view myview (id, name , age ) as select id , firstname & " " & lastname , age from students
データベースの利用時に実際に表示したり印刷する表は、主にビューである。
では、なぜ、ビューをテーブル(実表)として最初からDBMSに用意しないのだろうか?
ビューは次のような場合に必要となる。
・テーブルの正規化により分割されたテーブルを元のテーブルに結合して戻す
・テーブルを利用者の用途に応じて不要な部分を除き、必要な部分だけにして表示する
もし、データベースマネジメントシステム(DBMS)中に、予め必要となるテーブルを実表として全て用意しておくと、データの重複を生じ無駄であるばかりでなくデータの追加・更新・削除においてもコストがかさむ。
そこで、DBMS中には必要最小限の実表だけを用意し、実表以外のテーブルが必要な場合はビューとしてその都度クエリーで実表から組み立てなおして表示する方が良い解決法となる。
このように、利用時とデータの格納時で別々にデータを扱うために考案されたのが、3層スキーマと呼ばれるDBMSの構造である。
3層スキーマ構造:
DBMSを設計する際の基本的概念。DBMSを運用する際には、各スキーマ間で独立性が保たれていることが望ましい。
XAMPPを利用して、データベースで演習を行う。
今日の演習は、主に SQL コマンド だけを利用して進めて行く。 SQLの実行画面を開いて、コマンドを入力、 実行ボタンで実行。
新しいコマンドを実行するには、入力済みのコマンドを削除し、再入力する。
■演習1の実行手順
学籍簿を作成する。主キーの設定は後ほど行う。create table STUDENT ( ID integer , NAME char(12) )番号1、名前1は自分のものを利用する。名前はアルファベットを利用する(漢字の使用には文字コードの指定が必要)insert into STUDENT values ( 番号1, '名前1' ) insert into STUDENT values ( 番号2, '名前2' )create table CLASS ( CLASS_ID integer primary key, NAME char(12) ) insert into CLASS values ( 1, 'DataBase' ) 履修表を作成するcreate table STUDIES ( ID integer, CLASS_ID integer)自分の番号で、科目番号1の科目の履修を記録するinsert into STUDIES values ( 番号, 1 )上記演習の実行結果:
テーブルが3つ、ビューが1つ作成されている。
インデックスとは、テーブルのフィールドに管理用の見出し(目次)を作成し、データの検索効率など改善する仕組みのこと。
このインデックスはDBMSがデータ管理の為に利用するもので、SQLでインデックス番号を指定して並べ替えや検索などは行えない。
データベースには、大量のデータを効率よく処理するために、データの検索を高速で行う仕組みが必要である。
データ検索の高度なアルゴリズムを利用できるようにあらかじめDBMSにはインデックスと呼ばれる機能が用意されている。
データベースの設計者は、このアルゴリズムそのものを理解していなくても、処理の効率化を図るためにインデックスを利用することができる。
テーブルのフィールドに対してインデックスを設定すると、検索などの効率を上げることができる。
解説ページを用意したので時間があるときに参照しておくこと。
インデックス利用上の方針:
・ 単なるデータ記録用のテーブルには、データベースはインデックスを必要としない。
データの検索や並べ替えに利用しないフィールドについて、インデックスを作成しても無駄(インデックスの作成と構造の再編の負荷が増すだけ)である。
・大規模なテーブルの、頻繁に参照されるフィールドに対してインデックスを設定すると処理の効率が改善される。
■演習2の実行手順
STUDENT表のIDフィールドに index を設定することで、IDを利用したデータベースの処理効率(検索、データ追加、削除、修正)が改善される。
※効果の確認: 数万件のデータ登録後にテーブルを操作するとパフォーマンス向上を体感できるかもしれない。
トランザクションとは、データベースでデータを処理する為の一連の処理手続きのことです。
例えば、これまでMySQLで実行したSQL文、
insert into SHIILE values ( '2003/12', 'ABC', 10)
update ZAIKO set KAZU=KAZU+10 where NAME = 'ABC'
select * from ZAIKO
などもトランザクションです。
これまでの演習では、このSQLコマンドは、
1つのSQL文 = 1つの処理 = 1つのトランザクション
として処理されていました。
つまり、上記のSQLの例では、 insert と update と select の各処理は、
一つの命令の処理が完了 → データベースが更新される → 次の命令を処理
というように動作します。
この様に、データベースの更新を確定することを、コミット(Commit)といいます。
MySQLでは、デフォルトで自動コミットモードが有効で、SQLのコマンドを1つ処理するごとに、データベースの更新が確定します。
例)
insert into SHIILE values ( '2003/12', 'ABC', 10)
を実行→コミット。 テーブルにレコードが記録される。
update ZAIKO set KAZU=KAZU+10 where NAME = 'ABC'
を実行→コミット。 レコードが修正される。
select * from ZAIKO
を実行→コミット。 テーブルの内容が表示される。
しかし、これでは問題が生じる場合があります。例えば、insert で品物の入庫数を記録後にデータベースや通信回線に異常が生じて update が実行時エラーになったとします。
すると、入庫数は記録されているのに、在庫数の値が増えていないというデータ不整合が生じてしまいます。
そこで、上記の処理では複数のSQL文を、
複数のSQL文 = 1連の処理 = 1つのトランザクション
としてデータベースで一括して処理する方法が必要になります。
要点:
■トランザクションの実行中にエラーが生じると、トランザクションの処理全体が失敗したことになり、データベースはトランザクションの実行前の状態の元に戻ります。
■トランザクションの実行中は、他のトランザクションが割り込んで処理されることはありません。
■トランザクションの実行中に、エラー処理をしてデータベースを処理前の状態に戻す(ロールバック)ことができます。
マルチユーザ環境でのデータベースの問題点とその対処法について説明する。
上記の他にも、データベースのトランザクション処理では次の用語の理解が求められる。
MySQLでトランザクション処理を行う為のコマンド
例)
START TRANSACTION
SQL文
SQL文
SQL文
COMMIT
例)
START TRANSACTION
SQL文
SQL文
SQL文
エラーが発生したら、ROLLBACK
SQL文
SQL文
COMMIT
db??????? データベースを選択(演習1で作成したデータベース)CLIENT表を作成し、IDフィールドを主キーに設定する。以下のSQLコマンドをMySQLで実行し、テーブルを作成する。 (注意:下線の部分、char()ではカッコとrの間に空白を入れてはならない)create table CLIENT (ID integer primary key, NAME char(12) not null, TEL char(11)); 名前の部分は12文字以内、電話番号の部分は11文字以内で各自で適当にデータを考えて指定すること. IDの値は変更しないように。insert into CLIENT values ( 1, 'Test1', '0901231111');select * from CLIENT;わざと、主キーを衝突させてエラーを起こしてみる。insert into CLIENT values ( 2, 'Test2', '0901232222');insert into CLIENT values ( 1, 'Test3', '0901231111');insert into CLIENT values ( 3, 'Test4', '0901233333');2つ目のデータの追加でエラーが起きたので、CLIENT表はどうなったかを確認select * from CLIENT;start transaction;insert into CLIENT values ( 4, 'Test4', '0901234444');insert into CLIENT values ( 1, 'Test1', '0901231111');トランザクション全体が失敗して、ID番号4 は登録されていないことを確認select * from CLIENT;start transaction;insert into CLIENT values ( 5, 'Test5', '0901235555');rollback; insert into CLIENT values ( 6, 'Test6', '0901236666');ロールバックコマンドで トランザクション開始前の状態に復帰 するので、5番の顧客は登録キャンセルされているrollbackにより、ID番号5は登録されていないことを確認select * from CLIENT;データベースのユーザに、データベースの利用権限を設定するコマンドを紹介する。
SQLコマンド:
権限の部分で指定可能なキーワード:
ALL(全て)・SELECT・INSERT・UPDATE・DELETE・REFERENCESなど
ユーザー:
データベースを利用する際のユーザー名で権限を設定するユーザを指定する。
PUBLIC というキーワードでユーザを指定すると、全データベースユーザに対して権限を設定できる。
さらに、権限は以下の様な段階で細かく設定可能である。
・データベースサーバ全体
・データベース単位
・テーブル単位
・フィールド単位
GRANT コマンド や REVOKE コマンドによる権限設定の代わりに、次の手順でMySQLの管理画面からユーザの作成と権限の設定を行う。
ここまでで、今回の演習は終了です。
■ 時間に余裕があるようなら・・・・
・第2のテスト用アカウントに、データベースへの書き込み権限と修正権限を与え、権限を確認する。
insert や update が利用できるか確認
・CLIENT以外のテーブルについても start transaction によるトランザクション処理や、 rollback の確認をする。
MySQLのサーバ内のデータベースをエクスポートしてファイルに書き出し、Webclassへ提出。
手順:
・ MySQLの管理画面の ホーム を開く
・エクスポート のタブを開く
・実行するをクリック
・ブラウザに、データベースのエクスポートファイルがダウンロードされる。
ファイル名 127_0_0_1.sql または localhost.sql
・ダウンロードしたファイルを、Webclassの 第9回課題 としてアップロードする。