複数のプログラムからのデータベースへのアクセス

Menu Menu


MySQL

MySQL はサーバ型の Database Engine である。これを用いて、複数のプログラムから同時にDatabaseへアクセスする場合の使い方を調べる。


MySQL 上に自分のデータベースとテーブルを作成する

学校の MySQL サーバを立ち上げ、そこに自分のアカウントでデータベースとテーブルの作成を行う。

これまで作った例題のデータベースを作成せよ。


Single User での動作の確認

Perl の DBI module を切替えて、MySQL サーバにアクセスし、これまでの動作の確認をせよ。


実行時間の測定

sqlite3 と MySQL では実行時間にどれくらいの差があるかを測定せよ。


問題1

以上の結果をまとめてレポートして報告せよ。


競合状態 (Race Condition)

カウンタを増加させるプログラムを10個並行に動かし、繰り返し動作させる。

トランザクションやロックを用いずに、

    A SQL によるデータの読みだし
    B カウンタの増加
    C SQL によるデータの書き出し

を行って、カウンタの増加が意図したものと異なる場合を再現したい。


問題2

結果が異なる場合の実行の様子をコンパクトにまとめて、レポートせよ。


競合状態の再現

ユーザ1 が動作A を行うことを、

    1-A

と書く。続けてユーザ2が動作Aを行うと、

    1-A
    2-A

となる。これをトレース(trace)と言う。 分割された実行単位 1-A などを、トランザクションと呼ぶ。

ユーザ1とユーザ2で、競合状態が起きる場合をトレースで示せ。

以下の script を実行してデータベースを作って、

race-condition-0.pl table を作るperl script
race-condition-1.pl 最初のデータを作るperl script
以下の script を平行に実行して競合状態を示せ。

race-condition-2.pl non atomic にカウンタを増やす perl script


問題3

競合状態が起きる場合と、起きない場合を、UML のシーケンス図で示せ。


MySQL の使い方

サーバのIPアドレスとポートを調べる。

    外からアクセスできるように Windows のFirewallを設定する (mysql port を開ける)

root user からデータベースを作成する。

    create database mi070707;

できたことを確認する。

    show databases;

外からアクセスできるユーザを作成する。(root で) root のパスワードは、インストールした人に聞く。

    grant all on mi070707.* to kono identifyed by 'password_of_kono';
    flush priviledges;

新しい mysql では、

    mysql> create user kono identified by 'password_of_kono';
    mysql> grant all on mi070707.* to kono;

とする。

ここまで出来たら、ノートPCから接続してみる。

    mysql -h 10.10.122.119 -u kono -p
    Password:

Perl script の以下の port や database を以上で設定したものに変更する。

           use DBI;
           $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
           $dbh = DBI->connect($dsn, $user, $password);

Shinji KONO / Fri Jan 20 10:31:52 2012