無料Wikiサービス | デモページ
Linuxなどのメモ書き
検索

Adsense

MySQL トランザクション


Rev.6を表示中。最新版はこちら

トランザクションを使うと複数のクエリをまとめて処理することができる。処理の途中でエラーになった場合は変更内容を元に戻す(RollBack)ことができる。

トランザクションはInnoDBテーブルにしか使えない(デフォルトはMyISAM)。


InnoDBテーブルの作成

新規に作るテーブルをInnoDBにするには、以下のようにする。
mysql> CREATE TABLE friends (id SERIAL, name VARCHAR(30)
NOT NULL, address VARCHAR(100), birthday DATETIME) TYPE=InnoDB;
既存のテーブルのInnoDBに変更する場合は以下のとおり。
mysql> ALTER TABLE friends TYPE = INNODB;

トランザクションの開始


行単位のロック

実際にやってみた時の挙動



表1 トランザクションを使った時の挙動
スレッドA
スレッドB
mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
+----+--------+
1 row in set (0.00 sec)
mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
+----+--------+
1 row in set (0.00 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO friends
(name, address, birthday)
VALUES("suzuki", "Kamata xxxx",
"2006-05-13 12:34:56");
Query OK, 1 row affected (0.00 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)
mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
+----+--------+
1 row in set (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.01 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)


表2 ROLLBACKの挙動
スレッドA
スレッドB
mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO friends
(name, address, birthday)
VALUES("tanaka", "Kamata xxxx",
"2006-05-13 12:34:56");
Query OK, 1 row affected (0.00 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
| 3 | tanaka |
+----+--------+
3 rows in set (0.00 sec)

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)
mysql> ROLLBACK;

mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)
mysql> select id,name from friends;
+----+--------+
| id | name |
+----+--------+
| 1 | tomita |
| 2 | suzuki |
+----+--------+
2 rows in set (0.00 sec)



最終更新 2006/06/02 18:02:07 - kztomita
(2006/06/02 12:46:56 作成)
添付ファイル
transaction.png - kztomita