一、什么是保存点
如果开启了一个事务,并且已经输入了很多的语句时,如果忽然发现上一条语句有问题,可以用rollback语句来让数据库状态恢复到事务执行之前的样子,然后一切再重来。因为这个问题,MySQL提出了一个保存点savepoint的概念,就是在事务对应的数据库语句中打几个点,我们调用rollback语句时能指定回滚到哪个点,而不是最初的原点。
二、定义保存点
定义保存点的语法:save point 保存点名称;
注意:如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点被设置。
三、回滚到指定保存点
当想回滚到某个保存点的时候,可以使用如下语句:Rollback [work] to [savepoint] 保存点名称;
注意:
(1)work、savepoint不是必须填写的,可以省略
(2)rollback语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。
(3)rollback是我们手动去回滚事务时才使用的,如果事务在执行过程中遇到某些错误而无法执行的话,事务自身会自动回滚。
四、删除保存点
删除保存点,使用语句:Release savepoint 保存点名称
注意:
1、InnoDB 不会释放被存储在保存点之后的存储器中的行锁定。
2、如果执行 COMMIT 或 ROLLBACK,则当前事务的所有保存点被删除。
例1:直接使用rollback回滚
查询sc表所有学生数据
select *
from sc
删除所有性别为女的数据
delete
from sc
where ssex='女'
删除以后重新查询sc表数据没有女生
select *
from sc
执行rollback回滚
再次查询sc表所有学生数据,恢复数据
select *
from sc
例2:使用保存点回滚
操作前先查询sc表数据
将李君同学的班级号修改为95032
update sc
set class ='95032'
where sname ='李君'
查询李君同学的信息:
select *
from sc
where sname ='李君'
查询所有的sc表数据:
删除陆仪同学记录
delete
from sc
where sname='陆仪'
删除成功后,查看sc表数据
设置保存点1:test1152
SAVEPOINT test1152
再添加一条记录到sc中
insert into sc values('105' , '赵享' ,'男' ,'1995-01-01' , '95033',200)
设置保存点2:test1158
SAVEPOINT test1158
Rollback work to savepoint test1152
回滚到指定保存点test1152后,查看sc表数据,此时发现已经sc的数据已经回滚到删除陆仪同学后,即保存点“ test1152”之后的数据不再恢复,回到保存点“ test1152”之前的数据。
此时还能回滚到test1158保存点吗?不能。
因为test1158是在回滚点test1152之后设置的,所以回滚到前面test1152保存点后,后面的保存点就不存在了,自动被删除了。