9-3. MySQLマスター③トランザクション
またも横文字でなんだかなぁという感じですが、、、、
アプリケーションの中には、厳密には厳密を、さらに厳密にということが必要なものがあります。例えば、銀行口座から別の口座に預金を移す一連のクエリを作成する場合とかとか。
その場合、口座からお金を引き落とそうとした際に、その更新に失敗したり、預金がどこかに消えてしまったりしたら、大惨事です。
MySQLには、こういった起こりうる不測の事態をカバーするための「トランザクション処理機能」が備わっています。
1. トランザクション機能
1-1. トランザクションのストレージエンジン
1-2. BEGINの使用
1-3. COMMITの使用
1-4. ROLLBACKの使用
1-5. EXPLAINの使用
1-1. トランザクションのストレージエンジン
MySQLのトランザクション機能を使用できるようにするには、MySQLのInnoDBストレージエンジンを使用する必要があります。
これはテーブルを作成するときに別のパラメータを使用するだけです。
銀行口座のテーブルを作成してみます。
以下コマンドを入力します。
number INT,
balance FLOAT, PRIMARY KEY(number)
) ENGINE InnoDB;
DESCRIBE accounts;
続いて、トランザクションを使った練習が行えるようにテーブル内に行を2つ作成します。
INSERT INTO accounts(number, balance) VALUES(67890, 140.00);
SELECT * FROM accounts;
出力は以下のように。
口座番号12345の残高を1025.5、口座番号67890の残高を140に設定しています。
これでトランザクションの使用を始める準備おっけーです。
1-2. BEGINの使用
MySQLのトランザクションは、BEGINかSTART TRANSACTIONステートメントのいずれかで始めます。
口座番号12345の残高が25.11増え、1050.61になりました。
1-3. COMMITの使用
COMMITコマンドを使用すると、データベースのすべての変更をコミット(恒久的なものに)できます。
このときMySQLは、COMMITをうけとるまで、すべての変更を暫定的なものとみなしています。
1-4. ROLLBACKの使用
ROLLBACKコマンドを使用すると、MySQLに対してトランザクションの開始以降に行ったすべてのクエリを忘れ去り、トランザクションを終了するよう伝えることができます。
以下を入力して試してみます。 ROLLBACK;
UPDATE accounts SET balance=balance-250 WHERE number=12345;
UPDATE accounts SET balance=balance+250 WHERE number=67890;
SELECT * FROM accounts;
SELECT * FROM accounts;
次の出力が表示されます。
これはRollbackコマンドの使用によりトランザクション全体がキャンセルされ、2つの口座の残高が前に保持していた値に戻りました。
1-5. EXPLAINの使用
EXPLAINコマンドを使用すると、クエリがよりすぐれた効率的な方法で発行できるかどうかを調べるためのクエリのスナップショットを得ることができます。
結果はこう。
それぞれの意味を説明すると、、、
・table
クエリの対象となっている現在のテーブルです
・type
クエリのタイプ。表示される値は、最悪なものから(どゆこと?)順に、ALL、index、range、ref、eq_ref、const、systemがありNULLの場合もあります
・possible_keys
使用可能なPRIMARYキーが存在します
・key
実際に使用されるキー
・key_len
キーの長さ、インデックスのバイト数
・ref
キーで使用される列か定数を表示します
・row
クエリの実行に必要な行
MySQLが使用するキーやその長さがわかるのでクエリやテーブルの設計を見直して調整することができます。
いじょー
次はバックアップについて、です。
次で9章終了だーーーー
銭湯いってこよ・・・さっぱりしたい。