読者です 読者をやめる 読者になる 読者になる

リスを倒す 『初めてのPHP,MySQL,JavaScript&CSS』

『初めてのPHP,MySQL,JavaScript&CSS』勉強奮闘記

9-3. MySQLマスター③トランザクション

またも横文字でなんだかなぁという感じですが、、、、

アプリケーションの中には、厳密には厳密を、さらに厳密にということが必要なものがあります。例えば、銀行口座から別の口座に預金を移す一連のクエリを作成する場合とかとか。
その場合、口座からお金を引き落とそうとした際に、その更新に失敗したり、預金がどこかに消えてしまったりしたら、大惨事です。

MySQLには、こういった起こりうる不測の事態をカバーするための「トランザクション処理機能」が備わっています。


1-1. トランザクションのストレージエンジン


MySQLトランザクション機能を使用できるようにするには、MySQLInnoDBストレージエンジンを使用する必要があります。
これはテーブルを作成するときに別のパラメータを使用するだけです。

銀行口座のテーブルを作成してみます。
以下コマンドを入力します。

CREATE TABLE accounts (
number INT,
balance FLOAT, PRIMARY KEY(number)
) ENGINE InnoDB;
DESCRIBE accounts;

続いて、トランザクションを使った練習が行えるようにテーブル内に行を2つ作成します。

INSERT INTO accounts(number, balance) VALUES(12345, 1025.50);
INSERT INTO accounts(number, balance) VALUES(67890, 140.00);
SELECT * FROM accounts;

出力は以下のように。
f:id:taro-blog2323:20160913215554p:plain
口座番号12345の残高を1025.5、口座番号67890の残高を140に設定しています。
これでトランザクションの使用を始める準備おっけーです。


1-2. BEGINの使用


MySQLトランザクションは、BEGINかSTART TRANSACTIONステートメントのいずれかで始めます。
f:id:taro-blog2323:20160913215953p:plain

口座番号12345の残高が25.11増え、1050.61になりました。


1-3. COMMITの使用


COMMITコマンドを使用すると、データベースのすべての変更をコミット(恒久的なものに)できます。
このときMySQLは、COMMITをうけとるまで、すべての変更を暫定的なものとみなしています。

1-4. ROLLBACKの使用


ROLLBACKコマンドを使用すると、MySQLに対してトランザクションの開始以降に行ったすべてのクエリを忘れ去り、トランザクションを終了するよう伝えることができます。

以下を入力して試してみます。

BEGIN;
UPDATE accounts SET balance=balance-250 WHERE number=12345;
UPDATE accounts SET balance=balance+250 WHERE number=67890;
SELECT * FROM accounts;

ROLLBACK;
SELECT * FROM accounts;

次の出力が表示されます。
f:id:taro-blog2323:20160913220619p:plain
これはRollbackコマンドの使用によりトランザクション全体がキャンセルされ、2つの口座の残高が前に保持していた値に戻りました。


1-5. EXPLAINの使用


EXPLAINコマンドを使用すると、クエリがよりすぐれた効率的な方法で発行できるかどうかを調べるためのクエリのスナップショットを得ることができます。

EXPLAIN SELECT * FROM accounts WHERE number='12345';

結果はこう。
f:id:taro-blog2323:20160913221018p:plain

それぞれの意味を説明すると、、、

・table
 クエリの対象となっている現在のテーブルです

・type
 クエリのタイプ。表示される値は、最悪なものから(どゆこと?)順に、ALL、index、range、ref、eq_ref、const、systemがありNULLの場合もあります

・possible_keys
 使用可能なPRIMARYキーが存在します

・key
 実際に使用されるキー

・key_len
 キーの長さ、インデックスのバイト数

・ref
 キーで使用される列か定数を表示します

・row
 クエリの実行に必要な行

MySQLが使用するキーやその長さがわかるのでクエリやテーブルの設計を見直して調整することができます。


いじょー
次はバックアップについて、です。
次で9章終了だーーーー

銭湯いってこよ・・・さっぱりしたい。