事务之保存点(savepoint)

如果开启一个事务,已经写了很多语句,突然发现执行完上一语句时发现语句写错了。你只好使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章