如果开启一个事务,已经写了很多语句,突然发现执行完上一语句时发现语句写错了。你只好使用rollback语句让数据库恢复到事务开启之前的状态。以前写完的语句也需要重新执行。所以mysql数据库的作者提出了保存点(savepoint)的概念。开启事务后在执行语句后面打几个点,我们调用rollback语句就会回滚到指定的点。而不是回到事务执行之前的样子。
定义保存点的语法如下:
SAVEPOINT 保存点的名称;
当我们想回滚到某个保存点时,可以使用下边的语句。(WORK和SAVEPOINT可有可无)
ROLLBACK [WORK] TO [SAVEPOINT]
不过如果rollback后面不跟保存点的名称,事务就会回滚到执行之前的状态。
如果想删除某个保存点可以使用下面的语句。
RELEASE SAVEPOINT 保存点名称;
下面举个例子来说明保存点的用法。张三向猫爷转账2块钱。在执行完扣除张三2块钱处打一个保存点。
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 猫爷 | 2 |
3 | 张三 | 10 |
#开启事务
begin;
update account set balance =balance-2 where id=3;
savepoint s1; #一个保存点
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 猫爷 | 2 |
3 | 张三 | 8 |
UPDATE account SET balance = balance + 1 WHERE id = 2; #更新错了
回滚事务到保存点;
rollback to s1; #回滚到保存点
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 猫爷 | 2 |
3 | 张三 | 10 |