MySQL トランザクション
Rev.8を表示中。最新版はこちら。
トランザクションを使うと複数のクエリをまとめて1つの処理として扱うことができる。処理の途中でエラーになって処理を取り消したいような場合はROLLBACKをすることで変更内容を元に戻すことができる。トランザクションはInnoDBテーブルを使用する(デフォルトのMyISAMではトランザクションを使用できない)。
InnoDBテーブルの作成
新規に作るテーブルをInnoDBにするには、以下のようにする。mysql> CREATE TABLE friends (id SERIAL, name VARCHAR(30)既存のテーブルのInnoDBに変更する場合は以下のとおり。
NOT NULL, address VARCHAR(100), birthday DATETIME) TYPE=InnoDB;
mysql> ALTER TABLE friends TYPE = INNODB;
トランザクションの開始と完了およびROLLBACK
mysql> START TRANSACTION;mysql> COMMIT;
mysql> ROLLBACK;
実際にやってみた時の挙動
表1 トランザクションを使った時の挙動
No. | スレッドA | スレッドB |
---|---|---|
1 | 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) |
2 | mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) | |
3 | 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) | |
4 | 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) |
5 | mysql> COMMIT; Query OK, 0 rows affected (0.01 sec) | |
6 | 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の挙動
No. | スレッドA | スレッドB |
---|---|---|
1 | 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 | mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) | |
3 | 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) | |
4 | 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) |
5 | mysql> ROLLBACK; | |
6 | 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) |