MySQL トランザクション
Rev.7を表示中。最新版はこちら。
トランザクションを使うと複数のクエリをまとめて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 トランザクションを使った時の挙動
スレッド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) |