MySQLのSAVEPOINT と ROLLBACK TO SAVEPOINT と RELEASE SAVEPOINT

SAVEPOINTについて知らなかったので調べて、使ってみました。

対象のストレージエンジン

対象バージョン

  • 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からの機能です。