MySQLのSAVEPOINT と ROLLBACK TO SAVEPOINT と RELEASE SAVEPOINT
SAVEPOINTについて知らなかったので調べて、使ってみました。
SAVEPOINTとは
対象のストレージエンジン
- InnoDB
- DBD
対象バージョン
- 4.0.14以上
- 4.1.1以上
実験環境
MySQL | 4.1.22 |
SAVEPOINTの実行例
CREATE TABLE hoges ( id int(11) NOT NULL auto_increment, name varchar(255) default NULL, PRIMARY KEY (id) ) ENGINE=InnoDB ; BEGIN; INSERT INTO hoges (name) VALUES ('hoge1'); SAVEPOINT point1; INSERT INTO hoges (name) VALUES('hoge2'); SAVEPOINT point2; INSERT INTO hoges (name) VALUES('hoge3'); SAVEPOINT point3; SELECT * FROM hoges; +----+-------+ | id | name | +----+-------+ | 1 | hoge1 | | 2 | hoge2 | | 3 | hoge3 | +----+-------+ 3 rows in set (0.00 sec) ROLLBACK TO SAVEPOINT point2; SELECT * FROM hoges; +----+-------+ | id | name | +----+-------+ | 1 | hoge1 | | 2 | hoge2 | +----+-------+ 2 rows in set (0.00 sec) COMMIT;
SAVEPOINTをMyISAMで実行してみた
CREATE TABLE hoges ( id int(11) NOT NULL auto_increment, name varchar(255) default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM ; BEGIN; INSERT INTO hoges (name) VALUES ('hoge1'); SAVEPOINT point1; INSERT INTO hoges (name) VALUES('hoge2'); SAVEPOINT point2; SELECT * FROM hoges; +----+-------+ | id | name | +----+-------+ | 1 | hoge1 | | 2 | hoge2 | +----+-------+ 2 rows in set (0.00 sec) ROLLBACK TO SAVEPOINT point1; SELECT * FROM hoges; +----+-------+ | id | name | +----+-------+ | 1 | hoge1 | | 2 | hoge2 | +----+-------+ 2 rows in set (0.00 sec) COMMIT;
SAVEPOINT と ROLLBACK TO SAVEPOINT ではエラーは出ませんでした。ロールバックされないだけでした。
RELEASE SAVEPOINTについて
設定したSAVEPOINTを除外する機能ですが、MySQL4ではサポートされていません。MySQL5.0からの機能です。