我們可以在mysql事務處理過程中定義保存點(SAVEPOINT),然后回滾到指定的保存點前的狀態。
定義保存點,以及回滾到指定保存點前狀態的語法如下。
- 定義保存點---SAVEPOINT 保存點名;
- 回滾到指定保存點---ROLLBACK TO SAVEPOINT 保存點名:
下面演示將向表user中連續插入3條數據,在插入第2條數據的后面定義一個保存點,最后看看能否回滾到此保存點。
1、查看user表中的數據
- mysql> select * from user;
- +-----+----------+-----+------+
- | mid | name | scx | word |
- +-----+----------+-----+------+
- | 1 | zhangsan | 0 | NULL |
- | 2 | wangwu | 1 | NULL |
- +-----+----------+-----+------+
- 2 rows in set (0.05 sec)
2、mysql事務開始
- mysql> BEGIN;
- Query OK, 0 rows affected (0.00 sec)
3、向表user中插入2條數據
- mysql> INSERT INTO user VALUES ('3','one','0','');
- Query OK, 1 row affected (0.08 sec)
- mysql> INSERT INTO user VALUES ('4,'two','0','');
- Query OK, 1 row affected (0.00 sec)
- mysql> select * from user;
- +-----+----------+-----+------+
- | mid | name | scx | word |
- +-----+----------+-----+------+
- | 1 | zhangsan | 0 | NULL |
- | 2 | wangwu | 1 | NULL |
- | 3 | one | 0 | |
- | 4 | two | 0 | |
- +-----+----------+-----+------+
- 4 rows in set (0.00 sec)
4、指定保存點,保存點名為test
- mysql> SAVEPOINT test;
- Query OK, 0 rows affected (0.00 sec)
5、向表user中插入第3條數據
- mysql> INSERT INTO user VALUES ('5','three','0','');
- Query OK, 1 row affected (0.00 sec)
- mysql> select * from user;
- +-----+----------+-----+------+
- | mid | name | scx | word |
- +-----+----------+-----+------+
- | 1 | zhangsan | 0 | NULL |
- | 2 | wangwu | 1 | NULL |
- | 3 | one | 0 | |
- | 4 | two | 0 | |
- | 5 | three | 0 | |
- +-----+----------+-----+------+
- 5 rows in set (0.02 sec)
6、回滾到保存點test
- mysql> ROLLBACK TO SAVEPOINT test;
- Query OK, 0 rows affected (0.31 sec)
- mysql> select * from user;
- +-----+----------+-----+------+
- | mid | name | scx | word |
- +-----+----------+-----+------+
- | 1 | zhangsan | 0 | NULL |
- | 2 | wangwu | 1 | NULL |
- | 3 | one | 0 | |
- | 4 | two | 0 | |
- +-----+----------+-----+------+
- 4 rows in set (0.00 sec)
我們可以看到保存點test以后插入的記錄沒有顯示了,即成功團滾到了定義保存點test前的狀態。利用保存點可以實現只提交事務中部分處理的功能。