什么是SavePoint
SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样子,
语法
定义保存点的语法如下:
SAVEPOINT 保存点的名称;
当我们想回滚到某个保存点时,可以使用下边的语句。
ROLLBACK [WORK] TO 保存点的名称
删除保存点
RELEASE SAVEPOINT 保存点名称;
重要操作
开启事务: begin ....DML语句.... 设置保存点: savepoint 保存点名字 ....DML语句.... 设置保存点: savepoint 保存点名字2 ....DML语句.... 回滚保存点: rollback to 保存点名字2 (此时保存点2后面操作的状态都将回滚直保存点2时样子)
注意,回滚点无法随意跳转,例如上面,如果跳转到第一个保存点名字,就无法再到保存点名字2了,当事务整体提交、回滚时,保存点也随之释放。(一个事务中可以设置多少个保存点并无限制)
演示: 接下来用mysql演示一下,思路是向mysql insert三条数据, 每次insert设置一个保存点,在第三次insert后回滚到第一个保存点看下效果:
// 开始查询空表 mysql> select * from t_x; Empty set // 开启事务 mysql> begin; Query OK, 0 rows affected (0.01 sec) // 插入第一条数据 mysql> insert into t_x value(1, '1'); Query OK, 1 row affected (0.01 sec) // 设置保存点 mysql> savepoint a1; Query OK, 0 rows affected (0.01 sec) // 此时查询一条数据 mysql> select * from t_x; +----+------+ | id | name | +----+------+ | 1 | 1 | +----+------+ 1 row in set (0.01 sec) // 插入第二条数据 mysql> insert into t_x value(2, '2'); Query OK, 1 row affected (0.01 sec) // 设置保存点2 mysql> savepoint a2; Query OK, 0 rows affected (0.01 sec) // 查询两条数据 mysql> select * from t_x; +----+------+ | id | name | +----+------+ | 1 | 1 | | 2 | 2 | +----+------+ 2 rows in set (0.01 sec) // 插入第三条数据 mysql> insert into t_x value(3, '3'); Query OK, 1 row affected (0.01 sec) // 共三条 mysql> select * from t_x; +----+------+ | id | name | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 3 rows in set (0.01 sec) // 回滚到第一个保存点 mysql> rollback to a1; Query OK, 0 rows affected (0.01 sec) // 此时查询,只有第一个保存点时的一条数据 mysql> select * from t_x; +----+------+ | id | name | +----+------+ | 1 | 1 | +----+------+ 1 row in set (0.00 sec) // 尝试回滚到第二个保存点, 出错 mysql> rollback to a2; 1305 - SAVEPOINT a2 does not exist mysql>