【MySQL】ロールバック(ROLLBACK)する方法


ここではMySQLで、ロールバック(ROLLBACK)する方法を紹介しています。

MySQLのAUTOCOMMIT設定の確認

MySQLは、デフォルトの設定では、AUTOCOMMITが1となっており、SQLを発行すると即時コミットされる設定になっています。

AUTOCOMMITは次のSQLで確認できます。

mysql> SELECT @@global.autocommit;
+---------------------+
| @@global.autocommit |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.00 sec)

ロールバック(ROLLBACK)する方法

SQLを個別にロールバック可能にするには、明示的にトランザクションを発行しておきます。

例えば次のようなテーブルへのデータ登録をロールバックする場合です。
テーブルのデータは0件です。

mysql> DESC tab1;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| emp_id   | varchar(10)  | YES  |     | NULL    |       |
| emp_name | varchar(100) | YES  |     | NULL    |       |
| dept     | varchar(10)  | YES  |     | NULL    |       |
| age      | int(11)      | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> SELECT * FROM tab1;
Empty set (0.01 sec)

トランザクションの開始にはBEGINを宣言します。

その後、INSERT文を発行します。

INSERT文を発行した後、ROLLBACKを実行します。これで先ほど実行したINSERT文がロールバックされ取り消されました。

結果、0件のままとなっています。

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

mysql> INSERT INTO tab1 VALUES('00001','Suzuki','HR',28);
Query OK, 1 row affected (0.00 sec)

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

mysql> SELECT * FROM tab1;
Empty set (0.00 sec)

BEGINはSTART TRANSACTIONのエイリアスなので、BEGINではなく「START TRANSACTION」でも同様にトランザクションの開始を宣言できます。

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

mysql> INSERT INTO tab1 VALUES('00001','Suzuki','HR',28);
Query OK, 1 row affected (0.00 sec)

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

mysql> SELECT * FROM tab1;
Empty set (0.00 sec)